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

Android onNewIntent()のトリガー機構と注意事項

一、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(メール送信時は、#を@に置き換えてください。報告を行い、関連する証拠を提供してください。一旦確認が取れましたら、本サイトは即座に侵害を疑われる内容を削除します。)

おすすめ