我有一个名为HomeActivity的活动,它有一个SurfaceView并显示一个摄像头预览图片.如果您正在启动/重新启动它,此活动会很安静并且感觉很慢.
所以我做了一些调查,发现,不知何故总是调用onCreate方法.在我看来,如果活动已经开始,这不应该发生?
该文件说:第一次创建活动时调用.这是您应该执行所有常规静态设置的地方:创建视图,将数据绑定到列表等.此方法还为您提供包含活动先前冻结状态的Bundle(如果有).始终紧跟onStart().
这是处理返回的方法:
protected void gotoHome() {
final Intent intent = new Intent(SomeOtherActivity.this, HomeActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
Run Code Online (Sandbox Code Playgroud)
编辑:
以下是我离开HomeActivity的方式......没什么特别的:
final Intent i = new Intent(HomeActivity.this, SomeOtherActivity.class);
startActivity(i);
Run Code Online (Sandbox Code Playgroud) 应用程序中可以有许多活动,最后一次启动的活动保持在堆栈顶部,按下它完成当前活动.我有一系列活动,这里是流程..
如果我们有A,B,C(1),D,C(2) ......活动C(1)和C(2)是在导航应用程序时启动的两个不同的活动实例.那么必要的是清除活动C的所有实例,结果应该是当我完成C(2)时我应该留下这些堆栈A,B,D.我该怎么办 .
IMP -I希望将C(1)保持在堆栈中,直到我完成C(2),因为我可以使用New Task标志启动C而不是创建这些实例,但这些实例具有不同的UI和工作.
以下方法不利.
第一
@Override
public void onBackPressed(){
super.onBackPressed();
Intent intent = new Intent(C(2).this , D.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
startActivity(intent);
}
Run Code Online (Sandbox Code Playgroud)
这将清除Stack中的所有活动并重新启动Activity
第二
在单例类中保持Activity的跟踪,然后重新启动所需的流,这将消耗有许多活动要启动的时间.
所以我认为应该有一些解决方案使用包管理器或其他解决问题,解决方案是值得赞赏的
我有一个有很多活动的应用程序.其中许多活动可以启动其他活动,因此用户希望生成一个非常大的活动堆栈.
我目前正在使用默认活动启动行为.有人知道,如果一个大型活动堆栈(如> 100)会造成问题吗?这有限制吗?它会降低性能,导致ANR对话或类似的事情吗?
谢谢
我正在使用旗帜FLAG_ACTIVITY_SINGLE_TOP并FLAG_ACTIVITY_CLEAR_TOP回到之前的"标准"活动.我FLAG_ACTIVITY_SINGLE_TOP用来防止重新创建一个新实例.但我发现,该标志FLAG_ACTIVITY_SINGLE_TOP被忽略,活动完成并重新创建.
这是我在docs中找到的内容.FLAG_ACTIVITY_CLEAR_TOP:它表示您可以FLAG_ACTIVITY_SINGLE_TOP在使用时添加FLAG_ACTIVITY_CLEAR_TOP以防止"完成 - 重新创建".
这是另一个文档.FLAG_ACTIVITY_CLEAR_TOP:
注意:如果指定活动的启动模式是"标准",它也会从堆栈中删除,并在其位置启动一个新实例来处理传入的意图.这是因为当启动模式为"标准"时,总是为新意图创建新实例.
我误解了第一份文件吗?
可以说我有
A-> B-> C-> D->电子
在android后台堆栈中.我希望能够回到以下之一:
A->B->C
A->B
A
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?希望不会强制返回按钮点击.
这是我的场景:我有一系列Activity. 我为那些Activity会断开用户连接的超时设置了超时,以防用户暂时处于非活动状态。但我想将用户重定向到最后一个屏幕以防他登录
当我断开用户连接时,我正在调用它:
public void restartFromLoginActivity(boolean saveCurrentState, String previousLoggedUserId) {
Activity currentActivity = getCurrentActivity();
Intent intent = new Intent(CERHISApplication.this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
if(saveCurrentState && currentActivity != null){
Bundle extras = new Bundle();
extras.putString(ApplicationController.KEY_PREVIOUSLY_LOGGED_USER_ID, previousLoggedUserId);
intent.putExtras(extras);
currentActivity.startActivityForResult(intent, ApplicationController.RC_LOGIN);
}
else
startActivity(intent);
if(currentActivity != null)
currentActivity.finish();
}
Run Code Online (Sandbox Code Playgroud)
在我的LoginActivity检查中,userId 是否相同,如果相同,我尝试通过onActivityResult如下方式调用重定向用户:
if (getCallingActivity() != null && userId.equals(previouslyLoggedUserId))
setResult(RESULT_OK);
else
ApplicationController.startHomeActivity(this);
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为我FLAG_ACTIVITY_NEW_TASK根据自己的意图设置了标志。正如文档中所说:
当调用者从正在启动的活动中请求结果时,不能使用此标志。
据我了解, anActivity只能Activity从任务中接收结果。但是我需要设置这个标志,否则用户可以Activity stack通过按后退按钮返回。 …
我正在寻找一种从历史堆栈中删除某个活动的方法,并在这里找到了解决方案(Wakkas的anwer).但是,如果我在打开此活动的情况下关闭应用程序,例如通过按主页按钮,然后返回到该活动,则不会恢复活动.
如果我删除"noHistory"属性,它将返回并在kill后恢复.
有没有办法让它不出现在历史堆栈上(=不想通过在下一个活动中按后退按钮回到它)没有这种行为?
亲切的问候,水母
我想使用code从堆栈中删除一个活动.这是我的情况
- 从页面AI到第B页.
- 从页面B我必须使用返回按钮返回页面A.
- 在页面BI中有一个按钮到页面C.
- 当我点击页面B中的那个按钮时,我正在打电话
finish(); //to remove PageB from stack
Run Code Online (Sandbox Code Playgroud)
好的,这是问题,当我点击返回按钮时,从页面C我被带到页面A.因为它在堆栈中.
当我单击页面B中的按钮时,我想从堆栈中删除页面A.
请注意,在调用页面B时我无法在页面A中调用finish(),因为我想返回到页面A.只有在我点击页面B中的按钮时我不想返回的情况.
我怎么能在android中做到这一点?谢谢
我的编译器显示此消息...
调用所需的API级别16(当前最小值为14)
问题是...... "这个代码可以在api 14中运行吗?" 因为我没有设备来测试这个API版本,因为AVD没有GPS(要求)我是否必须实现支持库?
注意
它在API 16及更高版本上完美运行
TaskStackBuilder
PendingIntent contentIntent = TaskStackBuilder.create(this)
// add all of DetailsActivity's parents to the stack,
// followed by DetailsActivity itself
.addParentStack(Activity_TrackingMode.class)
.addNextIntent(new Intent(this, Activity_TrackingMode.class))
.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
Run Code Online (Sandbox Code Playgroud)
AndroidManifest
<activity android:name=".Activity_TrackingMode"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:parentActivityName=".Activity_Screen1">
<!-- Parent activity meta-data to support 4.0 and lower -->
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".Activity_Screen1" />
<intent-filter>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
Run Code Online (Sandbox Code Playgroud)