English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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 (во время отправки письма, пожалуйста, замените # на @) для жалоб и предоставьте соответствующие доказательства. При подтверждении факта нарушения авторских прав сайт немедленно удаляет涉嫌侵权的内容。