Урок 27. Читаем action из Intent

Обсуждение уроков
WKBAPKA
Сообщения: 32
Зарегистрирован: 03 янв 2014, 14:28

Re: Урок 27. Читаем action из Intent

Сообщение WKBAPKA » 25 авг 2017, 15:12

Tinky-Winky писал(а):Ответ на вопрос пользователя "compl"

День добрый и вам
Постараюсь ответить на ваш вопрос в свете личного понимания.
Поскольку при разработке мы используем синтаксис языка java(для файлов nameApp.java),то и базовые понятия должны соответствовать этому синтаксису.

Не много теории.

equals это - операция сравнения содержимого соответствующих переменным областям памяти

== это - операция сравнения ссылок.

В чём разница?

метод equals(Object) класса java.lang.Object
сравнивает содержимое двух областей памяти

== операция сравнения двух ссылок на объекты. Т.е. эта операция вернет true тогда и только тогда, когда содержимое совпадает, что означает, что переменные указывают на ОДИН И ТОТ ЖЕ объект.

Что касается вашего случая то здесь есть маленький нюанс.
Одинаковые строки на самом деле являются единственным объектом. В чем легко убедиться, выполнив следующий код:
[syntax=java]
String str1 = "string";
String str2 = "string";
System.out.println(str1==str2 ? "the same" : "not the same");
[/syntax]

Результатом будет "the same". Что означает, что ссылки на строки равны. Это сделано на уровне компилятора, очевидно, для экономии памяти. Компилятор создает ОДИН экземпляр строки, и присваивает str1 и str2 ссылку на этот экземпляр.

Однако, это относится только к строкам, объявленным как литералы, в коде. Если скомпоновать строку из кусков, ссылка на нее будет другой. Подтверждение – данный пример:

[syntax=java]
String str1 = "string";
String str2 = "str";
String str3 = "ing";
System.out.println(str1==(str2+str3) ? "the same" : "not the same");
[/syntax]
Результатом будет "not the same". Также можно создать новый объект с помощью копирующего конструктора:

[syntax=java] String str1 = "string";
String str2 = new String("string");
System.out.println(str1==str2 ? "the same" : "not the same");
[/syntax]
Результатом также будет "not the same".

Таким образом, иногда строки можно сравнивать и через сравнение ссылок. Но на это лучше не полагаться.
При объяснении использованы материалы из сайта(http://www.skipy.ru)

Надеюсь смог помочь
Java объектно-ориентированный и кроме примитивных типов все в Java - это классы.
Возможно в компилятор встроена определенная оптимизация, но с точки зрения теории
Str1 = "строка1";
Str2 = "строка1";

это тоже само что
Str1 = new String("строка1");
Str2 = new String("строка2");

т.е. 2 разных объекта и указатели на них будут разные.
Если предположить, что Str1 == Str2, т.е. указатель для них указывает на одну область памяти, тогда при изменении в Str1 значения автоматически поменяется и в Str2.

но в спецификации к языку есть такое понятие, как пул строк. и в определенных случаях указатели двух переменных будут указывать на одну область памяти.
как этот пул строиться, не могу сказать, внимательно не читал, но надеяться на такое сравнение я бы не стал.
Для класса String переопределен метод equals, при вызове которого этот метод выполняет посимвольное сравнение и возвращает true или false, т.е. не выполняет сравнение указателей,а сравнивает именно строку.

UserOfPikabu
Сообщения: 2
Зарегистрирован: 08 авг 2018, 07:26

Re: Урок 27. Читаем action из Intent

Сообщение UserOfPikabu » 08 авг 2018, 15:51

Здравствуйте!
Прежде чем опишу проблему, выдам своих исходники по уроку. Работаю в android studio 3.1.3
XML
Activity_main

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:background="#000000">


    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="ShowTime"
        android:id="@+id/Button1" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="ShowDate"
        android:id="@+id/Button2"/>

</LinearLayout>
Activity_main2

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">
    
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:id="@+id/TextViewId"
        android:textSize="50sp"
        android:layout_marginTop="30dp"
        android:layout_gravity="center_horizontal"/>

</LinearLayout>
Activity_main3

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
android:id="@+id/TextViewId"
android:textSize="50sp"
android:layout_marginTop="30dp"
android:layout_gravity="center_horizontal"/>

</LinearLayout>


Классы
MainActivity

Код: Выделить всё

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button time = (Button) findViewById(R.id.Button1);
        Button date = (Button) findViewById(R.id.Button2);
        time.setOnClickListener(this);
        date.setOnClickListener(this);

    }

    @Override
    public void onClick(View view) {
        Intent intent = null;
        switch (view.getId()){
            case R.id.Button1:
                intent = new Intent("MyUserTime");
                startActivity(intent);
            break;
            case R.id.Button2:
                intent = new Intent("MyUserData");
                startActivity(intent);
            break;
        }
    }
}
Main2Activity

Код: Выделить всё

public class Main2Activity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        Intent intent = getIntent();
        String action = intent.getAction();
        String format ="", textInfo = "";

        if (action.equals("MyUserTime")){
            format = "HH:mm:ss";
            textInfo = "Time: ";
        } else if (action.equals("MyUserData")){
            format = "dd.MM.yyyy";
            textInfo = "Date: ";
        }

        SimpleDateFormat sdf = new SimpleDateFormat(format);
        String datetime = sdf.format(new Date(System.currentTimeMillis()));

        TextView tvDate = (TextView) findViewById(R.id.TextViewId);
        tvDate.setText("Main2Activity: " + textInfo + datetime);
    }
}

Main3Activity

Код: Выделить всё

public class Main2Activity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        Intent intent = getIntent();
        String action = intent.getAction();
        String format ="", textInfo = "";

        if (action.equals("MyUserTime")){
            format = "HH:mm:ss";
            textInfo = "Time: ";
        } else if (action.equals("MyUserData")){
            format = "dd.MM.yyyy";
            textInfo = "Date: ";
        }

        SimpleDateFormat sdf = new SimpleDateFormat(format);
        String datetime = sdf.format(new Date(System.currentTimeMillis()));

        TextView tvDate = (TextView) findViewById(R.id.TextViewId);
        tvDate.setText("Main2Activity: " + textInfo + datetime);
    }
}
Манифест
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.smarthouseapplication.ms.myapplication">

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".Main2Activity"
android:label="Activity one">
<intent-filter>
<action android:name="MyUserTime" />
<action android:name="MyUserDate" />

<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".Main3Activity"
android:label="Activity two">
<intent-filter>
<action android:name="MyUserTime" />
<action android:name="MyUserDate" />

<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>

</manifest>
Теперь моя проблема. Я кликаю по ShowTime кнопке, появляется два окошка с предложением, что выбрать.
Когда кликаю по кнопке ShowDate, приложение вылетает.
Все перерыл в коде, но что я делаю не так, понять не могу.
Спасибо за помощь!

atos
Сообщения: 2
Зарегистрирован: 27 фев 2020, 13:53

Re: Урок 27. Читаем action из Intent

Сообщение atos » 29 фев 2020, 10:27

yanina_is писал(а):
14 фев 2015, 12:08
HamyaG писал(а):все, разобрался, оказывается каждый фильтр должен быть описан отдельно, а я пытался все засунуть в один, вот правильный код
Так оно и нужно в один фильтр все засунуть. По крайней мере я так поняла из урока. Вот мой манифест, все работает:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.yanina_is.p027" >

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="Info" android:label="Date/timeInfo">
<intent-filter>
<action android:name="ru.startandroid.intent.action.showdate"/>
<action android:name="ru.startandroid.intent.action.showtime"/>
<category android:name="android.intent.category.DEFAULT"/>

</intent-filter>
</activity>
</application>

</manifest>
Спасибо брат выручил. Никак не мог понять а оказывается так просто.

Rolik
Сообщения: 14
Зарегистрирован: 05 апр 2021, 06:42

Re: Урок 27. Читаем action из Intent

Сообщение Rolik » 07 май 2021, 12:43

Не очень хороший пример. Строковая переменная имеет то же название что и метод форматирования объекта в строковый вид. Если кто то не очень хорошо ориентируется в Java, это может запутать.

kirill18
Сообщения: 1
Зарегистрирован: 27 окт 2021, 15:14

Re: Урок 27. Читаем action из Intent

Сообщение kirill18 » 27 окт 2021, 15:16

потерял много времени разбираясь почему не предлагает открыть другие активити из 26 урока, оказалось что дело не в ошибке в коде а из-за этого:

"разработчик приложения сам решает, какие активити будут доступны, а какие нет, указывая для каждой активити в манифесте тэг android:exported равным true или false соответственно. Значение по умолчанию для этого тега ‒ false, т.е. все активити в AndroidManifest.xml, не имеющие этого тега, доступны только внутри приложения"

Ответить