如何将活动带到前台(或创建,如果不存在)?

Sol*_*vek 5 android broadcast task android-activity

我正在拦截带有一些信息的短信.然后在我的SmsListener中,我正在创建状态栏中显示的通知.然后,当用户点击我想要的通知时

  1. 将MainActivity带到前台(如果此类活动尚不存在,则应创建它)
  2. 从短信传递数据
  3. 根据此MainActivity中的此数据执行一些ui更改

我的活动被定义为

    <activity
        android:name=".MainActivity"
        android:screenOrientation="sensor"
        android:label="@string/app_name"
        android:launchMode="singleTask"/>
Run Code Online (Sandbox Code Playgroud)

活动启动为

 Intent i = new Intent();
 i.setClass(context, MainActivity.class);
 i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 context.startActivity(i);
Run Code Online (Sandbox Code Playgroud)

同样在我的活动中,我已经重写了onNewActivity方法

 @Override
 public void onNewIntent(Intent intent){
    super.onNewIntent(intent);

    // I have data from broadcast in intent variable passed to this activity
    processDataFromBroadcast(intent);
}
Run Code Online (Sandbox Code Playgroud)

如果MainActivity已经存在,它可以正常工作,但是如果MainActivity不存在则会启动但是不会调用onNewIntent

然后我尝试从onCreate调用processDataFromBroadcast : processDataFromBroadcast(getIntent()). 第一次将数据从我的广播正确传递到活动.但是,如果MainActivity被发送到后台然后再次被带到前台,则调用onCreate或onNewIntent,并且再次执行processDataFromBroadcast,并通过广播发送意图,因此我的MainActivity会在应用程序带到前台时每次使用广播数据进行更新 - 后者是不需要的,我怎么能让我的活动在第一次处理后忘记这个意图. 这是示例应用程序.

rog*_*rkk 5

对于仅启动其自身实例的活动,请查看<activity>清单元素,尤其是android:launchMode.您想要使用singleTask或配置它singleInstance.

要将数据传递到您的活动,您需要将数据添加到Intent用于打开它的数据中.要使用intent传递数据,请putExtra()在发送之前使用intent的方法,以及getExtra()在接收活动中检索它们的方法.

我假设您大致了解Intent是如何工作的,但如果不是,您可以通过查看这篇 Android开发人员文章来了解更多关于意图的知识.

  • 你是否使用后退按钮退出活动,顺便说一下?如果是这样,活动*将被杀掉,下次将创建一个新活动.我还认为onNewIntent()将在重新打开活动时被调用,无论它是通过您的意图还是其他方式移动到前台.您可能想要检查onNewIntent()内部的Intent类型,并且只能运行processDataFromBroadCast(),如果您可以将意图识别为您手动设置的意图. (2认同)