完成Android中的父级和当前活动
我有3个活动。 活动A导致活动B,而活动B又可以回到活动A或开始活动C.但是,如果我按回活动C,则应用程序应该closures。
总结一下:
- 活动A开始活动B
- 按下活动B应该会导致A.
- 活动B开始活动C
- 按下活动C应该closures应用程序
我应该如何从活动B去C? 这段代码目前在最后一行给我一个NullPointerException:
Intent intent=new Intent(ActivityB.this, ActivityC.class); startActivity(intent); ActivityB.this.finish(); ActivityB.this.getParent().finish();
如果我切换最后两行,我也得到一个空指针。
我不知道这是否会奏效,但你可以试试看:
-
从活动A,使用
startActivityForResult()
开始活动B的结果 -
在活动B中,当用户触发活动C时,开始活动C.
startActivity()
立即返回,所以
-
设定一个结果通知A也完成,
-
在B中调用
finish()
-
当A从B收到结果时,A也自己调用
finish()
。
如果不这样做,你可以让Activity C进入自己的应用程序,然后在第二个应用程序启动后closures第一个应用程序(使用A和B)。
PS在你前进的时候考虑Falmarri的评论!
祝你好运。
如果您想完成一项儿童活动的家长活动,
在父活动中,当触发子活动时,请使用以下命令: –
startActivityForResult(intent_name,any_integer_variable);
并以下面的方式覆盖onActivityResult方法:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(resultCode==2){ finish(); } }
现在,在子活动中,按照以下方式覆盖onStop和onDestroy:
protected void onStop() { setResult(2); super.onStop(); } @Override protected void onDestroy() { setResult(2); super.onDestroy(); }
请注意,我已经在子活动中将值设置为2,并在父活动中进行检查。 如果这个值与我设定的相同,那么父活动也将完成。 然后,您可以使用recursion方法进行进一步的活动。
你应该在你的父Activity中使用onActivityResult方法
假设活动A是活动B的父项。如果要在活动B中单击返回button以退出应用程序(也退出活动A)
在你的Activity B中,在onStop()
或onDestroy()
你打电话
setResult(0); //any int number is fine
这会将结果代码传递给其父代活动。
您的父母Actvity A,在您可以调用的方法内部侦听结果代码,您将需要使用onActivityResult
方法
if(resultCode == 0) //matches the result code passed from B { ActivityA.this.finish() }
它适用于我:)
要从活动“A”开始活动“B”,使用startActivityForResult方法如下:
Intent intent2 = new Intent(A.this,B.class); startActivityForResult(intent2,2);
而不是2你可以使用任何数字。
实施以下方法来捕捉儿童活动的结果:
protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == 2) { finish(); } }
请记住使用开始活动时使用的相同数字。
现在在活动“B”中执行以下操作:要启动活动“C”
Intent intent3 = new Intent(B.this,C.class); startActivityForResult(intent3,3);
实施方法
protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == 3) { setResult(2); finish(); } }
在这里,您通过将结果设置为2来完成活动“A”。因此,完成活动“B”也完成活动“A”。
在活动“C”中放置下面的行:
setResult(3);
一旦你的活动“C”开始,你以前的活动就完成了。
因此,从活动“C”的支持实际上closures应用程序。
我没有这样做。 这是我将如何修改你的代码。
你用来input另一个意图的代码:
Intent whatEverIntentName = new Intent("Path.to.next.Intent"); startActivity(whatEverIntentName); finish();
这样,当你按下时你总是退出。 可是等等! 你可以改变你想按下后按键的反应。
做这个:
@Override public void onBackPressed() { super.onBackPressed(); Intent whatEverIntentName = new Intent("Path.to.the.activity.before.it"); startActivity(whatEverIntentName); // Don't add finish here. //This is necessary because you finished your last activity with finish(); }
没有一个为我工作。 所以我find了一个解决scheme。 该帮助明确列出Intent.FLAG_ACTIVITY_CLEAR_TASK必须与Intent.FLAG_ACTIVITY_NEW_TASK一起使用。 所以这里是一个代码为我工作。
Intent intent=new Intent(ActivityB.this, ActivityC.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);
尝试这个
Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);
如果您在活动A上,并开始另一个活动,称为活动B.活动A – >活动B
现在想closures这两个活动。
然后在Activity B中使用下面的代码。
B.this.finish();
在Activity A中使用下面的代码:
startActivity(new Intent(A.this, B.class)); finish();
活动B一结束,活动A也将完成。
有一个缺点,我不知道可能是你想要这个还是不是。
缺点是,如果用户在活动B上,并且他/她按下button在活动A上移动,那么活动A也将在这种情况下完成。
这是完美的工作:
btn_back.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Player.this.finish(); } });
Intent intent=new Intent(ActivityB.this, ActivityC.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent);
你的活动C将根活动,并按回来将完成的应用程序。
在屏幕(B)中,您想要以无背景屏幕启动屏幕(C),只需启动此屏幕(C):
screenC.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(screenC); finish();
screenC中的后面将退出应用程序。
从活动A开始,使用startActivityForResult(intent,19)为结果启动活动B,
在活动B中,当用户触发活动C时,开始活动C.
startActivity()立即返回,所以
设定一个结果通知A也完成,
在B中调用finish()并在您的Child Activity In Parent Activity中的finish()方法之前调用setResult()方法,覆盖onActivtyResult(….)方法。 当A从B收到结果时,A也自己调用finish()。
enter code here @Override protected void onActivityResult(int arg0, int arg1, Intent arg2) { //Added by Ashish to close parent activity if(arg1==19){ finish(); } super.onActivityResult(arg0, arg1, arg2); }
让每个活动监听下一个活动的结果,如果发生这种情况,则自行完成。
您可以使用特殊的结果代码来表明您想要完成活动。
您可以重写后退键行为 :
活动A开始活动B
按下活动B应该会导致A.
活动B开始活动C
按下活动C应该closures应用程序
请注意,我不会从onBackPressed调用超级。 这也可以让你重写Android的浏览堆栈机制,我发现这是一个很大的优势,因为目前似乎没有办法以简单的方式从浏览堆栈中清除单个最旧的项目。
public class B extends Activity { ... @Override public void onBackPressed() { // Start activity A Intent aIntent = new Intent(this, A); startActivity(bIntent); } ... } public class C extends Activity { ... @Override public void onBackPressed() { // Close finish(); } ... }
如果需要,您也可以专门完成父级活动,但是使用这种方法,您不必担心。
下面的代码应该为你做。 几乎所有其他的方法,你的应用程序将保持在最近的应用程序。 Javadoc可以在https://developer.android.com/reference/android/app/ActivityManager.AppTask.html#finishAndRemoveTask()find。;
ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); if(am != null) { List<ActivityManager.AppTask> tasks = am.getAppTasks(); if (tasks != null) { tasks.get(0).finishAndRemoveTask(); } }
您可以使用finishAffinity()
,它将closures当前活动的当前和所有家长活动。
注意:但是从“子活动”到“父活动”的任何结果都不会被处理。
希望,它有帮助!