Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 通过intent返回到以前的活动_Android_Android Intent - Fatal编程技术网

Android 通过intent返回到以前的活动

Android 通过intent返回到以前的活动,android,android-intent,Android,Android Intent,我得到了以下呼叫流: 外部应用->我的活动A->打开浏览器->我的活动B 从外部应用程序,通过startActivityForResult可以启动我的活动A。活动A可以打开浏览器查看网站,从网站,用户可以单击链接并打开活动B的链接。现在我想关闭B并返回A。我该怎么办?如果我在B上调用finish(),我会看到浏览器。您可以使用Intent.FLAG\u activity\u CLEAR\u TOPIntent标志从活动B再次启动活动A。在此之前,您还需要更改清单中活动A的启动模式,将其设置为非标

我得到了以下呼叫流:

外部应用->我的活动A->打开浏览器->我的活动B


从外部应用程序,通过
startActivityForResult
可以启动我的活动A。活动A可以打开浏览器查看网站,从网站,用户可以单击链接并打开活动B的链接。现在我想关闭B并返回A。我该怎么办?如果我在B上调用
finish()
,我会看到浏览器。

您可以使用
Intent.FLAG\u activity\u CLEAR\u TOP
Intent标志从活动B再次启动活动A。在此之前,您还需要更改清单中活动A的
启动模式
,将其设置为非
标准

Intent intent = new Intent(this, ActivityA.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

我注意到,如果不更改活动A的启动模式,驻留在
活动A
顶部的其他活动仍将被清除,但不会调用
onNewIntent
,因为活动将被销毁并重新创建。

我使用此包装器将活动移动到前面:

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
protected static int moveToFront(Context ctx) {
    int result = 0;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { // honeycomb
        final ActivityManager activityManager = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);
        final List<RunningTaskInfo> recentTasks = activityManager.getRunningTasks(Integer.MAX_VALUE);

        for (int i = 0; i < recentTasks.size(); i++) 
        {
               O.Log.d(TAG, "Application executed : " 
                       +recentTasks.get(i).baseActivity.toShortString()
                       + "\t\t ID: "+recentTasks.get(i).id+"");  
               // bring to front                
               if (recentTasks.get(i).baseActivity.toShortString().indexOf(PACKAGE_NAME) > -1) {                     
                  activityManager.moveTaskToFront(recentTasks.get(i).id, ActivityManager.MOVE_TASK_WITH_HOME);
                  result = 1;
                  break;
               }else{
                   result = 2;
               }
        }
    }
    return result;
}
@TargetApi(Build.VERSION\u CODES.HONEYCOMB)
受保护的静态int-moveToFront(上下文ctx){
int结果=0;
如果(Build.VERSION.SDK\u INT>=Build.VERSION\u CODES.HONEYCOMB){//HONEYCOMB
最终ActivityManager ActivityManager=(ActivityManager)ctx.getSystemService(Context.ACTIVITY_服务);
最终列表recentTasks=activityManager.getRunningTasks(Integer.MAX_值);
对于(int i=0;i-1){
activityManager.moveTaskToFront(recentTasks.get(i).id,activityManager.MOVE_TASK_WITH_HOME);
结果=1;
打破
}否则{
结果=2;
}
}
}
返回结果;
}
结果值:

0-旧安卓版本 1-好的
2-故障

只有一个问题:从另一个应用程序使用startActivityForResult调用A,因此如果我从B调用它,我可以更改从外部应用程序接收到的A的意图。您可以将传入的意图保存在活动状态,然后在
onNewIntent
上,您可以解析相同保存的意图,是的,这似乎是一个很好的策略,我甚至认为这是一种将浏览器和B放入新“任务”并让B关闭“任务”的方法,包括浏览器活动,但我不知道是否可能这也是可能的。但是B将如何关闭浏览器活动,因为它是在浏览器活动之后启动的?我在考虑类似FinishAfinity()的东西,但我不知道它是否有效