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

时间:2011-02-05 07:03:12

标签: android android-activity task broadcast

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

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

        <activity
            android:name=".MainActivity"
            android:screenOrientation="sensor"
            android:label="@string/app_name"
            android:launchMode="singleTask"/>
    

    活动以

    启动
     Intent i = new Intent();
     i.setClass(context, MainActivity.class);
     i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
     context.startActivity(i);
    

    同样在我的活动中,我已经覆盖了onNewActivity方法

     @Override
     public void onNewIntent(Intent intent){
        super.onNewIntent(intent);
    
        // I have data from broadcast in intent variable passed to this activity
        processDataFromBroadcast(intent);
    }
    

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

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

3 个答案:

答案 0 :(得分:5)

对于仅启动其自身实例的活动,请查看<activity>清单元素,尤其是android:launchMode。您希望使用singleTasksingleInstance配置它。

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

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

答案 1 :(得分:1)

万一你的问题仍未得到解决,因为我遇到了同样的问题,这就是我解决问题的方法:

我正在创建一个时间戳作为intentId作为额外的意图。我第一次处理onCreate()onNewIntent()中的意图我正在读取intentId并将其存储为最后处理的意图。因此,下次调用onCreate()onNewIntet()时,我可以检查intentId,如果它等于最后处理的意图的id,我会忽略它!它不知道这对您的情况是否有帮助,也许您可​​以采用它。

要使intentId独立于活动生命周期,您可以将其保留在userdefaults中。

我同意人们会期望在setIntent(new Intent())中调用onNewIntent可以解决问题。

答案 2 :(得分:0)

回答很晚,但对寻求解决方案的其他人可能会有所帮助。

只需添加以下代码行:

Intent mIntent = new Intent(this, SplashActivity.class);
mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // You need this if starting the activity from a service
mIntent.setAction(Intent.ACTION_MAIN);
mIntent.addCategory(Intent.CATEGORY_LAUNCHER);

SplashActivity是初始应用程序的名称,它是应用程序的第一个屏幕。

希望它有所帮助。 :)