标签: activity-lifecycle

从历史堆栈中删除活动

我的应用在用户首次运行应用时显示了注册活动,如下所示:

  1. ActivitySplashScreen(欢迎来到游戏,注册一个帐户?)
  2. ActivitySplashScreenSignUp(很棒,请填写此信息)
  3. ActivityGameMain(主游戏画面)

因此,当用户点击每个屏幕上的按钮时,活动将以完全相同的顺序相互启动.

当用户从活动#2转到#3时,是否可以完全从历史堆栈中删除#1和#2?我喜欢它,以便如果用户在#3,并点击后退按钮,他们只是转到主屏幕,而不是回到启动画面.

我想我可以用任务来完成这个任务(即在#3上开始一个新任务)但是想看看是否有更简单的方法,

谢谢

android activity-lifecycle android-activity

374
推荐指数
9
解决办法
21万
查看次数

在注销时,清除活动历史记录堆栈,阻止"后退"按钮打开仅登录的活动

我的应用程序中的所有活动都要求用户登录才能查看.用户几乎可以从任何活动中注销.这是应用程序的要求.在用户注销的任何时候,我都想将用户发送到Login Activity.此时我希望此活动位于历史堆栈的底部,以便按"后退"按钮可将用户返回到Android的主屏幕.

我已经看到这个问题问了几个不同的地方,都回答了类似的答案(我在这里概述),但我想在这里提出收集反馈.

我已经尝试通过设置其Intent标志来打开Login活动,FLAG_ACTIVITY_CLEAR_TOP这似乎是在文档中概述的,但是没有实现我将Login活动放在历史堆栈底部并阻止用户导航回来的目标以前看到的登录活动.我也尝试使用android:launchMode="singleTop"清单中的Login活动,但这也没有完成我的目标(并且似乎无论如何都没有效果).

我相信我需要清除历史堆栈,或者完成之前打开的所有活动.

一种选择是让每个活动onCreate检查登录状态,finish()如果没有登录.我不喜欢这个选项,因为后退按钮仍可供使用,当活动靠近时自动导航.

下一个选项是维护LinkedList对所有可以从任何地方静态访问的开放活动的引用(可能使用弱引用).注销时,我将访问此列表并迭代所有先前打开的活动,并finish()在每个活动上进行调用.我很快就会开始实施这种方法.

但是,我宁愿使用一些Intent标志技巧来实现这一目标.我很高兴发现我可以满足我的应用程序的要求,而不必使用我上面概述的两种方法中的任何一种.

有没有办法通过使用Intent或清单设置来实现这一点,或者是我的第二个选择,保持已LinkedList打开的活动是最佳选择?或者我还有另一种选择吗?

android activity-lifecycle android-lifecycle

228
推荐指数
6
解决办法
11万
查看次数

Activity.finish()方法到底在做什么?

我正在开发Android应用程序一段时间,并且关注了很多关于活动生命周期和应用程序生命周期的帖子.

我知道Activity.finish()方法调用的方法Activity.onDestroy(),并从堆栈中删除活动,我想它以某种方式指向操作系统和垃圾收集器,他可以"做他的把戏"并释放内存,当它发现它是一个很好的时间做所以....

我来到这篇文章 - 退出申请不赞成?并阅读Mark Murphy的回答.

这让我对这个finish()方法究竟是做什么感到困惑.

我有机会打电话finish(),onDestroy()不会打电话吗?

android application-lifecycle activity-lifecycle ondestroy

148
推荐指数
7
解决办法
20万
查看次数

onActivityResult()之前是否调用onResume()?

以下是我的应用程序的布局:

  1. onResume()用户被提示登录
  2. 如果用户登录,他可以继续使用应用程序 3.如果用户随时退出,我想再次提示登录

我怎样才能做到这一点?

这是我的MainActivity:

@Override
    protected void onResume(){
        super.onResume();

        isLoggedIn = prefs.getBoolean("isLoggedIn", false);

        if(!isLoggedIn){
            showLoginActivity();
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是我的LoginActivity:

@Override
        protected void onPostExecute(JSONObject json) {
            String authorized = "200";
            String unauthorized = "401";
            String notfound = "404";
            String status = new String();

            try {
                // Get the messages array
                JSONObject response = json.getJSONObject("response");
                status = response.getString("status");

                if(status.equals(authorized)){
                    Toast.makeText(getApplicationContext(), "You have been logged into the app!",Toast.LENGTH_SHORT).show();
                    prefs.edit().putBoolean("isLoggedIn",true);

                    setResult(RESULT_OK, getIntent());
                    finish();
                }
                else if (status.equals(unauthorized)){
                    Toast.makeText(getApplicationContext(), "The username and password you …
Run Code Online (Sandbox Code Playgroud)

java android activity-lifecycle android-lifecycle android-activity

77
推荐指数
2
解决办法
4万
查看次数

活动生命周期 - onCreate呼吁每次重新定位

我有一个简单的活动加载位图onCreate.我发现如果我旋转设备,我可以从onCreate再次调用的日志中看到.实际上,因为所有实例变量都再次设置为默认值,所以我知道整个Activity已经重新实例化了.

旋转2次后,我得到一个FC,因为没有足够的内存可以分配给位图.(所有活动的实例是否仍然存在?或者GC的清理速度不够快?)

@Override
public void onCreate(Bundle savedInstanceState) {
    File externalStorageDir = Environment.getExternalStorageDirectory();
    File picturesDir = new File(externalStorageDir, "DCIM/Camera");
    File[] files = picturesDir.listFiles(new FilenameFilter(){
        public boolean accept(File dir, String name) {
            return name.toLowerCase().endsWith(".jpg");
        }});
    if (files.length > 0) {
        Bitmap bm = BitmapFactory.decodeStream(new FileInputStream(files[0]));
        ImageView view = (ImageView) findViewById(R.id.photo);
        view.setImageBitmap(bm);
    }
}
Run Code Online (Sandbox Code Playgroud)

从我读到的所有内容中,onCreate应该在应用程序的生命周期中调用一次.我错了吗?如何重新定位设备会导致重新创建活动?

android activity-lifecycle

58
推荐指数
9
解决办法
8万
查看次数

为什么不保证调用onDestroy()?

根据android Activity Lifecycle,唯一保证被调用的回调(如果一个活动离开Running状态,这通常是预期的)onPause().

因此,我必须假设有些情况下实施它们是有意义的onStop(),onDestroy()尽管它们并没有真正保证被调用.

我理解,onStop()当一个活动可能通过Stopped状态返回Running状态时应该实现(为什么它会这样做而不是直接返回是一个不同的问题).

但是onDestroy(),当我可以将所有清理/状态保存放入时onPause(),需要我不清楚.

你能描述一下实际的应用情况(即不能驾驶汽车等),实施它是否合理onDestroy()

android activity-lifecycle android-activity

45
推荐指数
1
解决办法
2万
查看次数

启动活动后立即调用OnPause和OnStop()

我有一项活动需要在启动时打开屏幕(如果是关闭).所以在onCreate中,我有:

this.getWindow().setFlags(
            WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                    | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,
            WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                    | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
Run Code Online (Sandbox Code Playgroud)

在广播接收器的wakelock的帮助下使用它,我能够在广播接收器启动时显示我的活动.

但问题很奇怪,活动生命周期以这种方式调用,onPause()和onResume在启动活动后立即调用

  1. 的onCreate
  2. 在onStart
  3. 的onResume
  4. 在onPause
  5. 的onStop
  6. 在onStart
  7. 的onResume

所以问题出在启动和恢复调用两次,在停止也调用,我想在onStop()中实现一些逻辑,但是,这样的行为应用程序将无法正常工作.

编辑

我发现问题只是由于标志FLAG_SHOW_WHEN_LOCKED.当设备被锁定时 它只会在活动开始前锁定设备时发生.

PS我正在使用带有广播接收器的报警管理器,然后从广播接收器开始活动.

android activity-lifecycle wakelock android-activity

43
推荐指数
1
解决办法
1万
查看次数

在Android中销毁布局时覆盖的方法

我有一个扩展LinearLayout的自定义组件,我需要在销毁或删除布局时执行某些语句.(或即将被删除)

一种方法是检查活动的onPause()或onDestroy()并调用自定义组件的方法.但我想从活动中删除这些开销.因此,自定义组件本身可以在分离布局时进行处理.但我发现删除布局时找到合适的方法来覆盖(检测事件).有没有办法处理这个,或者我们需要使用onPause()和onResume()方法的活动?

android view activity-lifecycle

37
推荐指数
3
解决办法
3万
查看次数

如何模拟杀戮活动以节省内存?

Android医生说:

"当系统而不是用户关闭活动以节省内存时......"

但是如何模拟这种情况?我想调试onRestoreInstanceState(Bundle)方法,但不知道如何.

android activity-lifecycle onrestoreinstancestate

34
推荐指数
4
解决办法
1万
查看次数

按Back按钮后Android Activity的生命周期

我对两个活动的生命周期感到困惑.

假设我有活动A和活动B.

B称为来自A ie A ----> B.

现在当前B在屏幕上,我按下后退按钮.在这里,我想知道: - 是否有任何内存仍然可用于B(活动)或B内存被刷新(非活动).

android activity-lifecycle

29
推荐指数
5
解决办法
5万
查看次数