flx*_*flx 45 android android-lifecycle android-activity
我有两个活动
MainActivity
DeepLinkActivity
我设置了所有内容,NavUtils
以便像在这里,这里和这里建议一样进行导航.
我想要实现的是:
DeepLinkActivity
深层链接开始MainActivity
只要我的应用程序在最近的应用程序中有任何任务,一切都很好.
但是,当我从最近的应用程序中删除我的应用程序时,它的行为如下:
DeepLinkActivity
深层链接开始我调试了代码,然后发现,NavUtils.shouldUpRecreateTask()
返回false
.
upIntent
将所有内容设置为正常,就像我的Component
设置一样.但是,NavUtils.navigateUpTo()
行为就像打电话一样finish()
.没有日志声明,没有.
任何想法,如何解决?
AndroidManifest.xml中
<activity
android:name=".DeepLinkActivity"
android:parentActivityName="my.package.MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="my.package.MainActivity"/>
<intent-filter>
<!-- Some intent filter -->
</intent-filter>
</activity>
Run Code Online (Sandbox Code Playgroud)
DeepLinkActivity.java
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
Intent upIntent = NavUtils.getParentActivityIntent(this);
if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
// create new task
TaskStackBuilder.create(this).addNextIntentWithParentStack(upIntent)
.startActivities();
} else {
// Stay in same task
NavUtils.navigateUpTo(this, upIntent);
}
return true;
default:
return super.onOptionsItemSelected(item);
}
}
Run Code Online (Sandbox Code Playgroud)
-----编辑-----
我意识到一些Google Apps以同样的方式被破坏了.如果你从搜索中跳到例如联系人,按下AB键,你会发现自己在主屏幕而不是联系人应用程序.(API19/CM11)
Sok*_*lov 56
我对OP问题的解决方案:
public void navigateUp() {
final Intent upIntent = NavUtils.getParentActivityIntent(this);
if (NavUtils.shouldUpRecreateTask(this, upIntent) || isTaskRoot()) {
Log.v(logTag, "Recreate back stack");
TaskStackBuilder.create(this).addNextIntentWithParentStack(upIntent).startActivities();
} else {
NavUtils.navigateUpTo(this, upIntent);
}
}
Run Code Online (Sandbox Code Playgroud)
isTaskRoot()
如果DeepLinkActivity是任务的根,则会返回true (应用程序或应用程序的初始启动先前已通过任务管理器终止).这样,如果在应用程序任务已经在前台时通过链接启动了活动,我就不会丢失现有的后台堆栈.
non*_*oni 22
我认为这种方法有问题.我已阅读支持库源代码,该方法检查intent的操作.它只适用于您之前创建的应用程序.如您所描述的,如果您从应用预览中删除它,则应该停止工作.
我用自己的"shouldUpRecreateTask"解决了这个问题.当我收到直接创建活动的通知(就像你的行为一样)时,我会从我的BroadCastReceiver中发送一个自定义Action.然后,在我的方法中,我做下一件事:
private final boolean shouldUpRecreateTask(Activity from){
String action = from.getIntent().getAction();
return action != null && action.equals(com.xxxxxx.activities.Intent.FROM_NOTIFICATION);
}
Run Code Online (Sandbox Code Playgroud)
..........................
if (shouldUpRecreateTask(this)) {
TaskStackBuilder.create(this)
.addNextIntentWithParentStack(upIntent)
.startActivities();
} else {
fillUpIntentWithExtras(upIntent);
NavUtils.navigateUpTo(this, upIntent);
}
Run Code Online (Sandbox Code Playgroud)
看起来似乎NavUtils.shouldUpRecreateTask(this, upIntent)
没有为这个特殊情况做好准备.
我目前的解决方法是检查,如果Activity
是深度链接并强制新的任务堆栈这样的情况.
就我而言,我在EXTRA
内部传递s中的对象.但是ACTION
,Uri
如果Activity
通过跟踪指向特定URL的链接或触摸NFC感知设备从外部启动,则设置为.
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
Intent upIntent = NavUtils.getParentActivityIntent(this);
if (NavUtils.shouldUpRecreateTask(this, upIntent)
|| getIntent().getAction() != null) { // deep linked: force new stack
// create new task
TaskStackBuilder.create(this).addNextIntentWithParentStack(upIntent)
.startActivities();
} else {
// Stay in same task
NavUtils.navigateUpTo(this, upIntent);
}
return true;
default:
return super.onOptionsItemSelected(item);
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
11448 次 |
最近记录: |