如何从通知中打开应用程序时应用正常活动顺序

时间:2015-12-23 13:19:13

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

这是我的方案:我有一项播放流式音乐并创建(和更新)通知的服务。按下通知时,用户将进入B活动。

我的应用程序的结构是A - >乙

当用户使用以下流程进入主屏幕时:B - > A - >主屏幕(服务继续播放音乐),按下通知将用户带到活动B,但现在他无法返回活动A.他被带到主屏幕。

我需要实施B - >每种情况的订单。

以下是我的代码段:

的AndroidManifest.xml:

<activity
    android:name=".ChannelListActivity"
    android:configChanges="locale|keyboard|keyboardHidden|screenLayout|fontScale|uiMode|orientation|screenSize"
    android:launchMode="singleTask" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<activity
    android:name=".NowPlayingActivity"
    android:parentActivityName=".ChannelListActivity"
    android:launchMode="singleTop" >
</activity>

以及创建通知的代码:

Intent intentGoToApp = new Intent(this, NowPlayingActivity.class);
intentGoToApp.putExtra(NowPlayingFragment.EXTRA_CHANNEL_ID, mUserData.getPlayingChannelId());
intentGoToApp.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent piGoToApp = PendingIntent.getActivity(getApplicationContext(), 0, intentGoToApp, PendingIntent.FLAG_CANCEL_CURRENT);

那么,我需要更改或添加什么来实现这种行为?提前谢谢......


编辑:我尝试添加以下代码,但仍未获得所需的结果...

Intent intentGoToApp = new Intent(this, NowPlayingActivity.class);
intentGoToApp.putExtra(NowPlayingFragment.EXTRA_CHANNEL_ID, mUserData.getPlayingChannelId());
intentGoToApp.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
//PendingIntent piGoToApp = PendingIntent.getActivity(getApplicationContext(), 0, intentGoToApp, PendingIntent.FLAG_CANCEL_CURRENT);

Intent intentMainActivity = new Intent(this, ChannelListActivity.class);

PendingIntent piGoToApp = TaskStackBuilder.create(this)
// add all of DetailsActivity's parents to the stack,
// followed by DetailsActivity itself
    .addNextIntentWithParentStack(intentMainActivity)
    .addNextIntentWithParentStack(intentGoToApp)
    .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);*/

3 个答案:

答案 0 :(得分:1)

您需要将活动A添加到backstack,以便Android知道退出每个活动的顺序。

您可能会发现此official documentation有用。

  

从Android 4.1(API级别16)开始,您可以声明逻辑   通过指定android:parentActivityName来指定每个活动的父级   <activity>元素中的属性。这允许系统   促进导航模式,因为它可以确定逻辑   使用此信息返回向上导航路径。

答案 1 :(得分:1)

通过在AndroidManifest.xml文件中声明此关系,将活动A作为活动B的父级,因此每次按下后退按钮时,将调用父活动:

<activity
    android:name=".ActivityB"
    android:label="Activity B"
    android:parentActivityName=".ActivityA">
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.yourpackage.MainActivity" />
</activity>

答案 2 :(得分:1)

你可以做的事情很少:

  1. 如果活动B已通过通知启动(并完成活动B),则在活动B的((YourParentClass) context).functionToRun();中启动活动A;

    public void onBackPressed() {}
  2. 而不是通过通知启动活动B - 启动活动A来处理意图并立即启动活动B;

    public class ActivityB extends Activity {
        static final String ACTION_NOTIFICATION = "ACTION_NOTIFICATION";
        boolean isStartedWithNotification;
    
        @Override
        protected void onNewIntent(Intent intent) {
            super.onNewIntent(intent);
            setIntent(intent);
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            ....
        }
    
        // OR onResume() if you don't use fragments
        @Override
        protected void onResumeFragments() {
            super.onResumeFragments();
            handleIntent();
        }
    
        void handleIntent() {
            Intent intent = getIntent();
            if (intent != null && ACTION_NOTIFICATION.equals(intent.getAction())) {
                // handle intent, populate UI based on it's information;
                isStartedWithNotification = true;
                setIntent(null);
            }
        }
    
        @Override
        public void onBackPressed() {
            if (isStartedWithNotification) {
                startActivity(new Intent(this, ActivityA.class)
                    .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                finish();
            } else {
                super.onBackPressed();
            }
        }   
    }
    
  3. 第一种方法更加苛刻,但是第一种方法在低端设备上可能会看到“眨眼”活动的开关。所以我从第一个开始。

    我希望,这有帮助