English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Механизм срабатывания и注意事项 для Android onNewIntent()

1. onNewIntent()

Перепишите следующие методы в IntentActivity: onCreate, onStart, onRestart, onResume, onPause, onStop, onDestroy, onNewIntent

1. При отправке Intent другим приложением выполняются следующие методы:

onCreate
onStart
onResume

Метод отправки Intent:

Uri uri = Uri.parse("philn://blog.163.com");
Intent it = new Intent(Intent.ACTION_VIEW, uri);  
startActivity(it);

2. Декларация приема Intent:

<activity android:name=".IntentActivity" android:launchMode="singleTask"
         android:label="@string/testname">
       <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="philn"/>
      </intent-filter>
</activity>

3. Если IntentActivity находится на вершине задачи, то есть это Activity, которая была открыта ранее и сейчас находится в состоянии onPause, onStop, при отправке Intent другим приложением выполнение будет в следующем порядке:

onNewIntent, onRestart, onStart, onResume.

В разработке приложений для Android запуск одной Activity из другой и передача данных в новую Activity очень проста, но когда вам нужно вернуть работающую в фоновом режиме Activity на передний план и передать данные, может возникнуть небольшая проблема.

В первую очередь, по умолчанию, когда вы запускаете Activity через Intent, даже если уже существует идентичная запущенная Activity, система создаст новый экземпляр Activity и покажет его. Чтобы не создавать экземпляры Activity несколько раз, мы должны настроить способ загрузки activity в AndroidManifest.xml для реализации режима единственной задачи, как показано ниже:

<activity android:label="@string/app_name" android:launchmode="singleTask"android:name="Activity1"></activity>

Когда launchMode установлен на singleTask, Activity запускается через Intent. Если система уже имеет экземпляр, запрос будет отправлен на этот экземпляр, но в этот момент система не вызовет метод onCreate, как обычно, а вызовет метод onNewIntent, как показано ниже:

protected void onNewIntent(Intent intent) {
 super.onNewIntent(intent);
 setIntent(intent);//необходимо хранить новый intent, если getIntent() вернет старый
 processExtraData();
// int data = intent.getIntExtra("HAHA", 0);

Не забывайте, что система может随时 убить Activity, работающую в фоновом режиме. Если это произойдет, система вызовет метод onCreate, а не onNewIntent. Хорошим решением будет вызов одного и того же метода обработки данных в методах onCreate и onNewIntent, как показано ниже:

public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
 processExtraData();
// int data = intent.getIntExtra("HAHA", 0);
protected void onNewIntent(Intent intent) {
 super.onNewIntent(intent);
  setIntent(intent);//необходимо хранить новый intent, если getIntent() вернет старый
 processExtraData();
// int data = intent.getIntExtra("HAHA", 0);
private void processExtraData(){
 Intent intent = getIntent();
 //Используйте полученные здесь данные
// int data = intent.getIntExtra("HAHA", 0);

Двоеч. onNewIntent() метод setIntent() и getIntent()

@Override
protected void onNewIntent(Intent intent) {
 super.onNewIntent(intent);
 super.onNewIntent(intent);
 // setIntent(intent);
 int data = getIntent().getIntExtra("HAHA", 0);
// int data = intent.getIntExtra("HAHA", 0);

}

Если не вызвать setIntent(intent), то данные, полученные с помощью getIntent(), не будут соответствовать вашим ожиданиям. Но, используя intent.getInXxx, можно получить правильный результат.

Обратите внимание на это предложение:

Лучше всего вызвать setIntent(intent), чтобы при использовании getIntent() не было проблем.

Вотcompiled информация о механизме срабатывания Android onNewIntent() и注意事项, продолжим пополнять соответствующую информацию, спасибо всем за поддержку нашего сайта!

Заявление: содержимое статьи предоставлено из Интернета, авторские права принадлежат соответствующему автору, контент предоставлен пользователями Интернета по своей инициативе и загружен самостоятельно, сайт не обладает правами собственности, не был отредактирован вручную и не несет ответственности за соответствующие юридические последствия. Если вы обнаружите содержимое,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма, пожалуйста, замените # на @) для жалоб и предоставьте соответствующие доказательства. При подтверждении факта нарушения авторских прав сайт немедленно удаляет涉嫌侵权的内容。

Основной учебник
Вам может понравиться