Mar*_*ark 374 android activity-lifecycle android-activity
我的应用在用户首次运行应用时显示了注册活动,如下所示:
因此,当用户点击每个屏幕上的按钮时,活动将以完全相同的顺序相互启动.
当用户从活动#2转到#3时,是否可以完全从历史堆栈中删除#1和#2?我喜欢它,以便如果用户在#3,并点击后退按钮,他们只是转到主屏幕,而不是回到启动画面.
我想我可以用任务来完成这个任务(即在#3上开始一个新任务)但是想看看是否有更简单的方法,
谢谢
Ait*_*mez 620
您可以通过在文件的相关条目中设置android:noHistory属性来实现此目的.例如:"true"<activity>AndroidManifest.xml
<activity
android:name=".AnyActivity"
android:noHistory="true" />
Run Code Online (Sandbox Code Playgroud)
Dan*_*Lew 136
您可以使用转发从活动堆栈中删除以前的活动,同时启动下一个活动. 在APIDemos中有一个这样的例子,但基本上你所做的只是在打电话finish()后立即打电话startActivity().
Mat*_*ias 51
是的,看一下Intent.FLAG_ACTIVITY_NO_HISTORY.
Tra*_*vis 23
这可能不是理想的做法.如果某人有更好的方法,我将期待实施它.以下是我使用pre-version-11 sdk完成此特定任务的方法.
在每个班级,你想要在晴朗的时候离开,你需要这样做:
... interesting code stuff ...
Intent i = new Intent(MyActivityThatNeedsToGo.this, NextActivity.class);
startActivityForResult(i, 0);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == R.string.unwind_stack_result_id) {
this.setResult(R.string.unwind_stack_result_id);
this.finish();
}
}
Run Code Online (Sandbox Code Playgroud)
然后需要从堆栈中引发弹出链的那个需要在你想要启动时调用它:
NextActivity.this.setResult(R.string.unwind_stack_result_id);
NextActivity.this.finish();
Run Code Online (Sandbox Code Playgroud)
然后活动不在堆栈上!
记住,你可以开始一个活动,然后开始清理它,执行不遵循单个(ui)线程.
mxc*_*xcl 22
在API 11之前工作的一种方法是首先启动ActivityGameMain,然后在该onCreateActivity中启动您的ActivitySplashScreen活动.ActivityGameMain因为你过早地调用startActivity 而不会出现这种情况.
然后,您可以ActivityGameMain通过在Intent上设置这些标志来清除堆栈:
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
Run Code Online (Sandbox Code Playgroud)
您还必须将其添加到ActivitySplashScreen:
@Override
public void onBackPressed() {
moveTaskToBack(true);
}
Run Code Online (Sandbox Code Playgroud)
因此,重新开始这项活动并不会回到你的身上ActivityGameMain.
我假设你不希望闪屏再次出现,为了达到这个目的,我建议将它设置为noHistory你的AndroidManifest.xml.然后将goBackPressed代码放入您的ActivitySplashScreenSignUp课程中.
但是我找到了一些方法来打破这个.ActivitySplashScreenSignUp显示时从通知启动另一个应用程序,并且不重置后退历史记录.
API 11中唯一真正的解决方法是:
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
Run Code Online (Sandbox Code Playgroud)
小智 17
我用这种方式.
Intent i = new Intent(MyOldActivity.this, MyNewActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)
startActivity(i);
Run Code Online (Sandbox Code Playgroud)
小智 8
我知道我迟到了(问题问题已经过去两年了)但是我通过拦截后退按钮完成了这个.我只是查看计数,而不是检查特定活动,如果它小于3,它只是将应用程序发送到后面(暂停应用程序并将用户返回到启动前运行的任何内容).我检查的不到三个,因为我只有一个介绍屏幕.此外,我检查计数,因为我的应用程序允许用户通过菜单导航回主屏幕,因此这允许他们通过其他屏幕备份,如果除了堆栈上的介绍屏幕之外的其他活动.
//We want the home screen to behave like the bottom of the activity stack so we do not return to the initial screen
//unless the application has been killed. Users can toggle the session mode with a menu item at all other times.
@Override
public void onBackPressed() {
//Check the activity stack and see if it's more than two deep (initial screen and home screen)
//If it's more than two deep, then let the app proccess the press
ActivityManager am = (ActivityManager)this.getSystemService(Activity.ACTIVITY_SERVICE);
List<RunningTaskInfo> tasks = am.getRunningTasks(3); //3 because we have to give it something. This is an arbitrary number
int activityCount = tasks.get(0).numActivities;
if (activityCount < 3)
{
moveTaskToBack(true);
}
else
{
super.onBackPressed();
}
}
Run Code Online (Sandbox Code Playgroud)
在清单中,您可以添加:
android:noHistory="true"
<activity
android:name=".ActivityName"
android:noHistory="true" />
Run Code Online (Sandbox Code Playgroud)
你也可以打电话
finish()
Run Code Online (Sandbox Code Playgroud)
调用startActivity(..)后立即
| 归档时间: |
|
| 查看次数: |
206134 次 |
| 最近记录: |