如何通过通知或其他方式启动活动(点击最近的应用列表,或直接打开应用)

时间:2015-03-15 07:52:57

标签: android android-intent android-activity android-notifications

我知道有一些关于这个问题的讨论,但我的情况有所不同。

我的案例:LanchActivity(加载动画) - > MainActivity(包括A和B两个标签) - > ThirdActivity。 MainActivity发布通知。单击通知时,我想要的是:

  • 如果应用程序在后台,请将应用程序置于前台,并在MainActivity中显示选项卡B.
  • 如果该应用被杀,请启动该应用,LanchActivity - > MainActivity,然后在MainActivity中显示选项卡B.

我已在上面实现,我设置了MainActivity:

android:launchMode="singleTask"

通知时使用以下设置:

Intent resultIntent = new Intent(this, LancherActivity.class);
resultIntent.setAction("android.intent.action.MAIN");
resultIntent.addCategory("android.intent.category.LAUNCHER");
PendingIntent resultPendingIntent = PendingIntent.getActivity(
         getApplicationContext(), 0, resultIntent,
         PendingIntent.FLAG_UPDATE_CURRENT);
serviceNotificationbuilder.setContentIntent(resultPendingIntent);
serviceNotification = serviceNotificationbuilder.build();
startForeground(1, serviceNotification);

在MainActivity中:

@Override
protected void onResume() {
  mTabHost.setCurrentTab(B);
}

我为MainActivity使用singleTask lanchMode的原因是每次单击通知时都避免创建新实例。但是,如果我使用上面的代码,我不想看到发生的事情。

  • 我从标签A启动ThirdActivity,单击返回按钮返回MainActivity,MainActivity显示标签B
  • 标签A显示在前台,单击主页按钮显示主页,然后从最近的应用列表中恢复应用,它也会显示标签B,因为mTabHost.setCurrentTab(B);

因此mTabHost.setCurrentTab(B);仅在MainActivity来自通知时才有效。但我不知道MainActivity从通知或其他方式开始(最近的应用列表或直接打开应用程序)。

  1. 如果该应用被杀,通知 - > LancherActivity - >主要活动。在这种情况下,我可以设置resultIntent.putExtra("flag", "I from Notificaion");,因此我可以使用该标志来检查MainActivity是否来自通知。
  2. 如果应用程序未被杀死,无论是在后台还是前台,通知 - > MainActivity,它将直接转到MainActivity而不通过LancherActivity。所以我不知道MainActivity来自哪里。
  3. 任何人都有解决方案,谢谢?

2 个答案:

答案 0 :(得分:0)

首先,删除MainActivity的android:launchMode="singleTask"并更新您的通知意图,如下所示:

Intent resultIntent = new Intent(this, LancherActivity.class);
resultIntent.putExtra("openTabB",true);// add this line

在您的LaunchActivity中,创建一个boolean字段说openTabB并将其设置为false
在LaunchActivity的onCreate方法中,使用此行

openTabB = getIntent().getExtras().getBoolean("openTabB");

在LaunchActivity中使用MainActivity调用者的Intent。将boolean额外添加到该意图中,键为openTabB,值为openTabB字段。

现在,在您的MainActivity中,使用以下行:

openTabB = getIntent().getExtras().getBoolean("openTabB");
if(openTabB)
{
    //open tab B
} 
else
{
    // normal execution
}

我希望这对你有所帮助。

答案 1 :(得分:0)

您应该在onPause()中保存当前标签的索引,并将其恢复为onResume()。

保存索引:

int index = tabHost.getCurrentTab();

恢复索引:

tabHost.setCurrentTab(index);

修改 MainActivity从通知或其他方式开始的唯一区别是从通知开始需要通过onCreate()和其他方式没有。所以你需要在onCreate()中添加一个标志。

private boolean flag;
private in mCurrentTab = 1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    flag = true;
}

@Override
protected void onResume() {
    if (flag)
        setCurrentTab(1); // set to B
    else
        setCurrentTab(mCurrentTab);
    flag = false;
}

@Override
protected void onPause() {
    mCurrentTab = tabHost.getCurrentTab();
}