11

シナリオは次のとおりです。

AndroidManifest.xml では、単一のアクティビティを で定義しandroid:launchMode="singleTask"ます。(これは、アプリケーションのライフサイクル全体を通じて、スタック内に単一のアクティビティが存在する必要があることを意味しますよね?)

の間Activity.onCreate()に、ブロードキャスト レシーバがプログラムによって作成され、着信 SMS をリッスンします。Activity.onPause() 受信機は設計後もアクティブなままです。

ユーザーがアプリケーションを使い終わったら、デバイスのホーム ボタンを押すと、呼び出しが行われ、Activity.onPause()アプリケーションが消えます。デバイスに Android のホーム画面が表示されます。

SMS を受信すると、ブロードキャスト レシーバーは SMS を受信し、次の方法でアクティビティを表示しようとします。

Intent it = new Intent(context, Akami.class);
it.setAction(Intent.ACTION_MAIN);
it.addCategory(Intent.CATEGORY_LAUNCHER);
it.setComponent(new ComponentName(context.getPackageName(), "MyActivity"));
it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(it);

ただし、アクティビティはユーザーには表示されません。

  • a) どうして?
  • b) Activty を前面に出すにはどのような方法がありますか?
4

2 に答える 2

19

MyMainActivity定義 (AndroidManifest.xml) :

<intent-filter>
 <action android:name="intent.my.action" />
 <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

プログラムでアプリケーションをフォアグラウンドにする:

Intent it = new Intent("intent.my.action");
it.setComponent(new ComponentName(context.getPackageName(), MyMainActivity.class.getName()));
it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.getApplicationContext().startActivity(it);

注:オブジェクトが起動したいアクティビティと同じcontext.startActivity(it)場合は機能しません。context

于 2012-10-15T09:21:01.273 に答える
1

はい、あなたが言っていることは正しいです。BroadcastReciever を用意し、Activity にインテントを発行してフォアグラウンドにします。ただし、Activity のライフサイクルに関しては注意が必要です。

Android OS は、システム リソースに応じて、アクティビティを onPause() から onStop() および onDestroy() に移行できます。そのような場合、呼び出し元のアクティビティが再び再開されるので、その点に注意してください。そうでなければ、非常に簡単に NullPointerExceptions に遭遇します

于 2012-10-11T13:46:57.457 に答える