English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
一、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>
3IntentActivityがタスクスタックのトップにいる場合、つまり以前に開いたActivityが現在onPause、onStop状態にある場合、他のアプリがIntentを送信すると、実行順序は以下の通りです:
onNewIntent、onRestart、onStart、onResume。
Androidアプリケーション開発中、Activityから別のActivityを起動し、データを新しいActivityに渡すことは非常に簡単ですが、バックグラウンドで実行しているActivityをフロントグレードに戻し、データを渡す必要がある場合、少し問題が発生する可能性があります。
まず、デフォルトでは、Intentを通じてActivityを起動した場合、すでに同じ活動中のActivityが存在する場合でも、システムは新しいActivityインスタンスを作成し表示します。Activityインスタンスが複数作成されないようにするために、AndroidManifest.xmlでactivityのロード方法(launchMode)を設定して、単一タスクモードを実現する必要があります。以下のように示されます:
<activity android:label="@string/app_name" android:launchmode="singleTask"android:name="Activity1></activity>
launchModeがsingleTaskの場合、Intentを通じてActivityに起動するとき、システムがすでに同じActivityのインスタンスが存在する場合、システムはリクエストをそのインスタンスに送信しますが、この場合、システムは通常処理するonCreateメソッドを呼び出しません。代わりに、以下のようにonNewIntentメソッドを呼び出します:
protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent);//新しいintentを保存する必要がありますが、getIntent()が古いものを返す場合は除いて processExtraData(); }
忘れないでください、システムはいつでもバックグラウンドで実行中のActivityを殺すことがあります。これが起こった場合、システムはonCreateメソッドを呼び出し、onNewIntentメソッドを呼び出しません。良い解決策は、onCreateとonNewIntentメソッドで同じデータ処理メソッドを呼び出すことです。以下のように示されます:
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); processExtraData(); } protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent);//新しいintentを保存する必要がありますが、getIntent()が古いものを返す場合は除いて processExtraData(); } private void processExtraData(){ Intent intent = getIntent(); //ここで受け取ったデータを使用する }
二、onNewIntent()のsetIntent()とgetIntent()
@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); // setIntent(intent); int data = getIntent().getIntExtra("HAHA", 0); // int data = intent.getIntExtra("HAHA", 0); }
setIntent(intent)を呼び出さない場合、getIntent()で取得されるデータは期待するデータではありません。しかし、intent.getInXxxを使用すると、正しい結果を得ることができます。
注意してください:
注意してください:getIntent()は元のIntentを返します。setIntent(Intent)を使用して、これを新しいIntentに更新することができます。
したがって、setIntent(intent)を呼び出すことをお勧めします。これにより、getIntent()を使用したときに問題が発生する可能性が低くなります。
以上がAndroid onNewIntent()のトリガーメカニズムおよび注意点に関する情報の整理です。今後も関連する情報を追加していく予定です。皆様の本サイトへのサポートに感謝します。
声明:本文の内容はインターネットから提供され、著作権者に帰属します。インターネットユーザーが自発的に貢献し、自己でアップロードしました。本サイトは所有権を持ちません。人工的な編集は行われていません。また、関連する法的責任を負いません。著作権侵害を疑う内容がある場合は、メールまでお知らせください:notice#oldtoolbag.com(メール送信時は、#を@に置き換えてください。報告を行い、関連する証拠を提供してください。一旦確認が取れましたら、本サイトは即座に侵害を疑われる内容を削除します。)