标签: android-lifecycle

执行重新创建方法后未恢复的活动暂停

我有一个HoneyComb的项目,我在主Activity中的onResum()方法上使用了recreate()方法后出错.

11-10 22:05:42.090: E/ActivityThread(1917): Performing pause of activity that is not     resumed: {com.blogspot.honeyapp/com.blogspot.honeyapp.Main}
11-10 22:05:42.090: E/ActivityThread(1917): java.lang.RuntimeException: Performing pause of activity that is not resumed: {com.blogspot.honeyapp/com.blogspot.honeyapp.Main}
11-10 22:05:42.090: E/ActivityThread(1917):     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2517)
11-10 22:05:42.090: E/ActivityThread(1917):     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2505)
11-10 22:05:42.090: E/ActivityThread(1917):     at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:2483)
11-10 22:05:42.090: E/ActivityThread(1917):     at android.app.ActivityThread.access$700(ActivityThread.java:122)
11-10 22:05:42.090: E/ActivityThread(1917):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1031)
11-10 22:05:42.090: E/ActivityThread(1917):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-10 22:05:42.090: E/ActivityThread(1917):     at android.os.Looper.loop(Looper.java:132)
11-10 22:05:42.090: E/ActivityThread(1917):     at android.app.ActivityThread.main(ActivityThread.java:4123)
11-10 22:05:42.090: E/ActivityThread(1917):     at java.lang.reflect.Method.invokeNative(Native Method)
11-10 22:05:42.090: E/ActivityThread(1917):     at java.lang.reflect.Method.invoke(Method.java:491)
11-10 22:05:42.090: E/ActivityThread(1917): …
Run Code Online (Sandbox Code Playgroud)

android android-lifecycle

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

活动生命周期

我正在努力了解一个活动的完整生命周期.

所以我在Google上搜索并发现了很多关于活动生命周期的教程,但在所有教程中我都没有在生命周期图中找到这些方法:
1.2 OnContentChanged()
. OnPostCreate()
3. OnPostResume()
4. OnWindowfocusChanged()
5. OnuserLeaveHint()
6. OnUserInteraction()
7.OnDetachedFromWindow()

我想知道为什么这些方法不包含在android docs的活动生命周期图中.

还有一个问题:
当第一次创建一个活动时,系统调用该OnContentChanged()方法作为第一种方法,系统最后一次调用是OnDetachedFromWindow()一个活动被杀死的方法,但是android文档说活动的整个生命周期发生在OnCreate()和之间OnDestroy()

android activity-lifecycle android-lifecycle android-activity

11
推荐指数
1
解决办法
2493
查看次数

为什么在我的Activity启动后立即调用onStop?

我有一个活动需要在启动时打开屏幕(以防屏幕关闭).所以在我看来onCreate,我有:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
            |WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
            |WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
            |WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
Run Code Online (Sandbox Code Playgroud)

使用这种直接的组合,我能够在我的后台服务启动时显示我的活动(是的,这是一个合法的案例).

然而,问题是当我在这种情况下启动我的活动时,存在一种非常奇怪的生命周期行为.使用广泛的日志记录,我能够确定在活动开始后立即发生以下7个步骤:

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

看到了吗?对于简单的活动开始,onStart被调用两次.更重要的是,onStop被神秘地称为,即使活动刚刚开始 - 没有任何事情会导致它停止.

我已经在许多不同的场景中对此进行了测试,看起来这种奇怪的行为只发生在屏幕关闭且活动在被破坏后启动时.如果屏幕打开,或者活动已停止[但尚未销毁],则活动正常启动,onStart仅调用一次.

结论:似乎当我的活动启动并且强制启动屏幕时,Android会启动活动,然后停止活动,然后再次启动它,原因无关紧要.

那么:为什么会这样呢?我有什么办法可以解决这个问题(所以只有在有正当理由的情况下才会调用onStop)?


笔记:

  • 有问题的活动是使用singleTasklaunchmode
  • 我试过禁用键盘锁/锁,但它没有效果
  • 我在运行Android 3.2的三星Galaxy Tab 10.1上见证了这种行为.我还没有测试这是否适用于其他任何事情......

android android-lifecycle android-activity

11
推荐指数
1
解决办法
4423
查看次数

区分Android杀死应用程序和用户在最近的应用程序列表上滑动它

我正在开发一个项目,当我在一个特定的Activity上时,我们会显示一个本地粘性通知.当应用程序最小化时也应如此.我必须完成的是在应用程序被杀死时删除本地通知(由于内存不足或由用户通过Android,从最近的应用列表中滑动).

通常onDestroy会在Android使用Activity打开一些空间时调用.在其中一种情况下这很好,但是从最近的应用程序列表中滑动应用程序不会调用onDestroy并且粘滞通知保持不变.

我做的是,我实现了一个空的服务,它将强制onDestroy应用程序被杀死(刷卡和系统杀死),这样我就可以删除我的通知.

但是,我想要做的是区分滑动和系统杀死.

这甚至可能吗?

android android-lifecycle android-activity

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

Why am I getting "Unable to pause activity IllegalStateException: Restarter must be created only during owner's initialization stage" in Android?

I am using a FragmentActivity and sometimes on Crashlytics, I am able to see an exception Fatal Exception: java.lang.RuntimeException: Unable to pause activity

Below is the onPause of my FragmentActivity

@Override
protected void onPause() {
    super.onPause();
    if (EventBus.getDefault().isRegistered(this))
        EventBus.getDefault().unregister(this);
}
Run Code Online (Sandbox Code Playgroud)

Here is the stack trace of this crash.

Fatal Exception: java.lang.RuntimeException: Unable to pause activity {com.avail.easyloans.android/com.avail.easyloans.feature.marketplace.activities.ActivityMarketplace}: java.lang.IllegalStateException: Restarter must be created only during owner's initialization stage
       at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3471)
       at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3430)
       at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3402)
       at android.app.ActivityThread.access$1300(ActivityThread.java:151)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1416)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:157) …
Run Code Online (Sandbox Code Playgroud)

android android-lifecycle illegalstateexception onpause android-fragmentactivity

11
推荐指数
0
解决办法
861
查看次数

使用FragmentTransaction.replace()时Android片段视图状态丢失

我有一个很大的问题,我不太了解发生了什么.我正在开发一个使用Fragments(来自支持库)的应用程序,并且正在使用FragmentTransaction.replace()将新片段放到后端堆栈上并替换旧堆栈.代码如下:

FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = ft.beginTransaction();
// Animations in my res/anim folder
ft.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right);
ft.replace(R.id.fragment_container, newFragment, tag);
ft.addToBackStack(null);
ft.commit();
Run Code Online (Sandbox Code Playgroud)

这成功地取代了我的片段.我的问题如下.在一个片段中,我有一个根据用户输入构建的项目列表.现在,当用户单击下一步然后单击后退按钮(返回列表)时,列表为空,因为视图已被销毁.现在,我注意到以下内容:

  1. 不调用onSaveInstanceState.我相信这是因为只有当父Activity告诉它时才会调用它.基于以下文档:"在很多情况下,片段可能会被大部分拆除(例如放置在没有显示UI的后台堆栈上),但是在其拥有的活动实际需要保存其状态之前不会保存其状态".显然,在FragmentTransaction上执行替换不是其中之一.有没有人对此有确认或更好的解释?
  2. setOnRetainInstanceState(true)在这种情况下没有帮助.同样,我认为这与文档中的信息有关:"控制是否在活动重新创建(例如从配置更改)中保留片段实例".我没有在重新创建活动时执行任何操作,所以这没用.

所以,我想我的主要问题是:有没有办法在使用时保留View状态(只是保留Fragment)replace?有FragmentTransaction.add(),但也存在一些问题.一个是没有执行退出动画,因此动画不正确.另一个是旧片段(即处于不可见状态的片段)仍然是可点击的新片段.例如,如果我有一个ListFragment,并且我使用add将内容片段放在其上,我仍然可以单击ListFragment中的列表项.

android android-lifecycle android-fragments android-fragmentactivity

10
推荐指数
1
解决办法
3015
查看次数

锁定屏幕后调用Android onCreate

当我的应用程序在"顶部"运行时锁定屏幕时,系统几乎立即调用onCreate(屏幕仍为黑色).这种破坏性行为可能是什么原因?

lifecycle android locking oncreate android-lifecycle

10
推荐指数
2
解决办法
2693
查看次数

使用"向上"按钮在Android中恢复状态

onSaveInstanceState()用来存储ArrayList成员变量并onCreate()在主要活动的方法中恢复它.这适用于大多数情况,例如旋转屏幕等但如果我打开一个新活动并使用"向上"按钮(而不是后退按钮)导航回主屏幕,它似乎创建一个新的主要活动而不通过国家捆绑onCreate().

我已经确认当按下向上按钮时,onDestroy()为主活动的原始实例调用该方法,这对我来说没有意义,因为我希望它恢复现有活动,就像我按下后退按钮而不是创建一个新一.

有没有办法可以强制新活动恢复旧活动或只恢复现有活动?

android android-lifecycle android-activity

10
推荐指数
1
解决办法
1558
查看次数

是否总是调用onActivityCreated?

查看https://github.com/xxv/android-lifecycle上的优秀图表,它表示在片段重启时不会调用onActivityCreated().

我对此表示怀疑:

  • 真的吗?有人可以提供一些链接来做解释生命周期行为的文档吗?
  • 究竟什么是Fragment restart()?
  • Android可以决定删除不可见的片段,但是保留那些包含它们的活动吗?

注1:我已经测试过,由于活动重新创建而添加了Fragment时调用了onActivityCreated,并且在活动完全启动和激活后手动添加片段时也是如此.

注2:我正在使用23.3.0支持版本进行测试.某些行为是否有可能从以前的版本发生变化?

android android-lifecycle android-fragments

10
推荐指数
1
解决办法
3229
查看次数

Android实时数据 - 观察配置更改后始终触发

我目前正在重构我的代码,将ViewModel包含在android.arch库提供的LiveData中.我有一个简单的活动,可以将密码更改请求发送到服务器,并根据HTTP响应代码执行操作.

为此,我创建了一个类,它扩展了ViewModel的数据和一个存储库类来调用服务器.我的ViewModel类有一个MutableLiveData字段,我使用.observe(...)方法从我的活动订阅.问题是.observe(...)中的代码在配置更改(即屏幕旋转)后一直触发,我不明白为什么.

以下是ViewModel,Repository和Activity类的代码:

ChangePasswordViewModel

public class ChangePasswordViewModel extends ViewModel{

    private MutableLiveData<Integer> responseCode;
    private PasswordChangeRepository passwordChangeRepository;

    public ChangePasswordViewModel() {
        responseCode = new MutableLiveData<>();
        passwordChangeRepository = new PasswordChangeRepositoryImpl();
    }

    public MutableLiveData<Integer> responseCodeLiveData() {
        return responseCode;
    }

    public void sendChangePasswordRequest(String newPassword){
        passwordChangeRepository.changePassword(newPassword,     passChangeCallback());
    }

    // Callback that fires after server sends a response
    private Callback passChangeCallback(){
        ...
        responseCode.postValue(serverResponse)
        ...
}
Run Code Online (Sandbox Code Playgroud)

PasswordChangeRepository

public class PasswordChangeRepositoryImpl {

    public void changePassword(String newPassword, Callback<Void> callback){
        //Sending new password to server and processing response in callback
        ServerCalls.changePassword(newPassword, callback); …
Run Code Online (Sandbox Code Playgroud)

android android-lifecycle android-livedata

10
推荐指数
1
解决办法
3563
查看次数