这是我的方案:我有一项播放流式音乐并创建(和更新)通知的服务。按下通知时,用户将进入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);*/
答案 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)
你可以做的事情很少:
如果活动B已通过通知启动(并完成活动B),则在活动B的((YourParentClass) context).functionToRun();
中启动活动A;
public void onBackPressed() {}
而不是通过通知启动活动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();
}
}
}
第一种方法更加苛刻,但是第一种方法在低端设备上可能会看到“眨眼”活动的开关。所以我从第一个开始。
我希望,这有帮助