我有一个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) 我正在努力了解一个活动的完整生命周期.
所以我在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
我有一个活动需要在启动时打开屏幕(以防屏幕关闭).所以在我看来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个步骤:
看到了吗?对于简单的活动开始,onStart被调用两次.更重要的是,onStop被神秘地称为,即使活动刚刚开始 - 没有任何事情会导致它停止.
我已经在许多不同的场景中对此进行了测试,看起来这种奇怪的行为只发生在屏幕关闭且活动在被破坏后启动时.如果屏幕打开,或者活动已停止[但尚未销毁],则活动正常启动,onStart仅调用一次.
结论:似乎当我的活动启动并且强制启动屏幕时,Android会启动活动,然后停止活动,然后再次启动它,原因无关紧要.
那么:为什么会这样呢?我有什么办法可以解决这个问题(所以只有在有正当理由的情况下才会调用onStop)?
笔记:
singleTasklaunchmode我正在开发一个项目,当我在一个特定的Activity上时,我们会显示一个本地粘性通知.当应用程序最小化时也应如此.我必须完成的是在应用程序被杀死时删除本地通知(由于内存不足或由用户通过Android,从最近的应用列表中滑动).
通常onDestroy会在Android使用Activity打开一些空间时调用.在其中一种情况下这很好,但是从最近的应用程序列表中滑动应用程序不会调用onDestroy并且粘滞通知保持不变.
我做的是,我实现了一个空的服务,它将强制onDestroy应用程序被杀死(刷卡和系统杀死),这样我就可以删除我的通知.
但是,我想要做的是区分滑动和系统杀死.
这甚至可能吗?
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
我有一个很大的问题,我不太了解发生了什么.我正在开发一个使用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)
这成功地取代了我的片段.我的问题如下.在一个片段中,我有一个根据用户输入构建的项目列表.现在,当用户单击下一步然后单击后退按钮(返回列表)时,列表为空,因为视图已被销毁.现在,我注意到以下内容:
所以,我想我的主要问题是:有没有办法在使用时保留View状态(只是保留Fragment)replace?有FragmentTransaction.add(),但也存在一些问题.一个是没有执行退出动画,因此动画不正确.另一个是旧片段(即处于不可见状态的片段)仍然是可点击的新片段.例如,如果我有一个ListFragment,并且我使用add将内容片段放在其上,我仍然可以单击ListFragment中的列表项.
android android-lifecycle android-fragments android-fragmentactivity
当我的应用程序在"顶部"运行时锁定屏幕时,系统几乎立即调用onCreate(屏幕仍为黑色).这种破坏性行为可能是什么原因?
我onSaveInstanceState()用来存储ArrayList成员变量并onCreate()在主要活动的方法中恢复它.这适用于大多数情况,例如旋转屏幕等但如果我打开一个新活动并使用"向上"按钮(而不是后退按钮)导航回主屏幕,它似乎创建一个新的主要活动而不通过国家捆绑onCreate().
我已经确认当按下向上按钮时,onDestroy()为主活动的原始实例调用该方法,这对我来说没有意义,因为我希望它恢复现有活动,就像我按下后退按钮而不是创建一个新一.
有没有办法可以强制新活动恢复旧活动或只恢复现有活动?
查看https://github.com/xxv/android-lifecycle上的优秀图表,它表示在片段重启时不会调用onActivityCreated().
我对此表示怀疑:
注1:我已经测试过,由于活动重新创建而添加了Fragment时调用了onActivityCreated,并且在活动完全启动和激活后手动添加片段时也是如此.
注2:我正在使用23.3.0支持版本进行测试.某些行为是否有可能从以前的版本发生变化?
我目前正在重构我的代码,将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)