11

这是场景:

AndroidManifest.xml 定义了一个带有android:launchMode="singleTask". (这意味着在整个应用程序生命周期中,堆栈中应该只有一个活动,对吧?)

在 期间Activity.onCreate(),广播接收器以编程方式创建并侦听传入的 SMS。即使在Activity.onPause() 设计之后,接收器仍然保持活动状态。

当用户完成应用程序时,他按下调用设备的主页按钮,Activity.onPause()应用程序消失。设备随即显示 Android 主屏幕。

收到短信后,广播接收器会收到短信并尝试通过以下方式显示活动:

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 操作系统可以根据系统资源将您的活动从 onPause() 转移到 onStop() 和 onDestroy()。因此,在这种情况下,您的调用 Activity 将再次重新启动,因此请在此处采取预防措施。否则,很容易遇到 NullPointerExceptions

于 2012-10-11T13:46:57.457 回答