我的应用程序似乎表现得很完美,但我不明白一件事。当我按下主页按钮并返回到我的应用程序时,之前的状态会(自动)恢复。当我按下主页按钮然后手机在主屏幕(或除我自己的任何其他视图之外的任何其他视图)中进入睡眠状态并返回到我的应用程序时,之前的状态将(自动)恢复。
现在,关键是当手机在我的 Activity 处于睡眠状态时,它不会自动恢复以前的状态,但似乎会调用 onCreate() 因为开始初始化发生并且我的应用程序的行为就像它刚刚启动一样。
我能够保存实例并使用 saveInstanceState() 调用存储的状态,所以最终问题是可以解决的,但我的问题是:如果 Android 从我的活动中进入睡眠状态,而不是从另一个活动中进入睡眠状态,为什么它会调用 onCreate()?如果它不调用 onCreate() 发生了什么,为什么我必须打扰 saveInstanceState() 因为在每个实例中(除非内存不足)我的应用程序将用户返回到他们的最后一个“地标”,除非手机进入睡眠状态从我的活动。
我应该使用什么方法将我的应用程序移动到背景,然后再将其移动到前台?我尝试使用moveTaskToBack(true)并将活动成功移动到后台,但后来我无法将其移动到前台.我尝试使用startActivity()再次启动活动,但没有成功,似乎没有方法moveTaskToFront()或类似的东西.
我有一个应用程序是一个活动.
一切都按照我的预期工作,除非我把电话(三星Galaxy Ace运行姜饼)用侧面的按钮睡觉.当我这样做时,会调用以下内容(按此顺序):
onPause,onStop,onDestroy,onCreate,onStart,onResume,onPause.
这是没有唤醒手机,它仍然睡着了 - 屏幕关闭.
为什么活动被完全杀死并重新创建?
更奇怪的是,如果手机再切换回来,则会发生以下情况:
onResume,onPause,onStop,onDestroyed,onCreate,onStart,onResume
即使它已经"准备好了"(坐在onPause中),它也会被杀死并重新创建.
如果应用程序正在运行并按下Home,则活动仅停止,而不是被杀死,一旦停止,我可以将手机置于睡眠状态,然后再将其唤醒,活动永远不会被杀死.它只是去onRestart等......这是我所期待的.
仅当手机在活动运行时(并在前台)进入睡眠状态时,才会出现此问题.
我已经阅读了有关活动生命周期的文档,但我无法弄清楚为什么会出现这种情况.
我试图找出如何模拟暂停活动来调试我的应用程序.我希望onPause被调用但不是onStop.我只是想尝试一个暂停恢复周期,我正在寻找一些我可以调用的代码(例如按下按钮后)来触发这个.
有什么想法?
我看到人们建议在其他线程中按下主页按钮,但是当我这样做时,停止应用程序并调用onStop以及onPause,因此它不是我想要的.
在活动生命周期图中,有一个从“onStop”到“应用程序进程已终止”到“onCreate”的箭头。一直想知道,现在我要对片段做一个小讨论;如果整个应用程序进程被销毁,onCreate 如何从 onStop 接收包?系统是否会跟踪被杀死的应用程序及其活动包?我认为这就是它的方式,因为那时被终止的应用程序将分配给它的内存为零。
此外,从页面管理活动生命周期>启动活动的最后一段,“系统在所有情况下调用 onPause() 和 onStop() 之后调用 onDestroy(),除了一种情况:...'情况并未说明为内存不足。这让我认为箭头不应该从 onStop 转到 onCreate 因为“具有更高优先级的应用程序需要内存”。这是一个错字还是我读错了?我想我'因为'Killable'而读错了吗?'一般而言,活动生命周期的运动如下所示:'图表。
其中之一必须是活动生命周期图表中的箭头或“系统在它已经调用 onPause() 和 onStop() 之后调用 onDestroy() 之后在所有情况下除了一种:...”语句错误。希望我是在断章取意的情况下阅读的。
我Activity用a 创建了Navigation Drawer,并用 a 替换了选项图标(位于右上角)以ImageButton处理后退单击。
问题是,我不知道该怎么做。我对如何使用后退按钮有点困惑。我应该使用什么代码才能转到上一个Activity?
后退按钮用于:Activity 到另一个 Activity 以及 MainActivity 到 Fragment 活动。
这是我的清单代码:
<activity
android:name="com.teamamazing.with_sidebar.activity.Accomodation"
android:label="Accomodation"
android:parentActivityName="com.teamamazing.with_sidebar.activity.SpecialPage">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.teamamazing.with_sidebar.activity.SpecialPage" />
</activity>
Run Code Online (Sandbox Code Playgroud)
这是我的住宿活动:
package com.teamamazing.with_sidebar.activity;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import com.teamamazing.with_sidebar.R;
public class Accomodation extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_accomodation);
} }
Run Code Online (Sandbox Code Playgroud)
这是我的SpecialPage 代码:它将成为父活动。
package com.teamamazing.with_sidebar.activity;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
import com.teamamazing.with_sidebar.R;
public class SpecialPage …Run Code Online (Sandbox Code Playgroud) android android-intent activity-lifecycle android-fragments android-activity
单击按钮时,我需要关闭活动。不幸的是,当单击按钮时,活动确实消失了,但仍在后台。用户仍然可以选择它并返回到前面。我需要的是完全消失/破坏的活动。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}
Run Code Online (Sandbox Code Playgroud)
我在相关问题上搜索了 SO,但是,它们都没有帮助完全关闭活动。我已经尝试添加返回,添加另一个广播侦听器并传递命令以在 onCreate 之外调用完成。所以在这一点上,问题是 - 这真的可能还是 Android 是这样工作的,您可以调用 finish() 但它仍然在后台,用户可以重新启动它。
这是xml文件。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.app1.test.myapplication">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Run Code Online (Sandbox Code Playgroud)
编辑:添加 android:excludeFromRecents="true" 并不能解决问题。以下是重新创建此问题的步骤,如果有人认为它是重复的或已解决,请尝试发表评论/答案,我会接受。 …
android android-layout activity-lifecycle activity-finish android-activity
已解决(底部的解决方案)
在我的活动中,我需要阅读首选项,然后覆盖配置。在构造函数中 Context 还没有准备好:
尝试在空对象引用上调用虚拟方法“java.lang.String android.content.Context.getPackageName()”
在onCreate为时已晚:
java.lang.IllegalStateException: getResources() 已经被调用
引 自ContextThemeWrapper文档:
[ applyOverrideConfiguration ] 方法只能调用一次,并且必须在调用 getResources() 或 getAssets() 之前调用。
什么是覆盖配置的正确时间和地点?
下面是我当前工作解决方案的代码摘录。
class OverrideActivity extends AppCompatActivity {
// ...
private boolean __overrideConf = false;
@Override
public Resources getResources() {
if (!__overrideConf) {
// ...
// read shared preferences needs context
// ...
applyOverrideConfiguration(configuration);
__overrideConf = true;
}
return super.getResources();
}
}
Run Code Online (Sandbox Code Playgroud)
解决方案(覆盖受保护的方法attachBaseContext)
@Override
protected void attachBaseContext(Context newBase) …Run Code Online (Sandbox Code Playgroud) android android-preferences activity-lifecycle android-activity
据我了解,在片段onCreate中创建片段事件侦听器会不会更好?如果在onCreateView中完成,则每次片段返回视图时都必须重做(onResume())?在它设定的地方会有所作为吗?
我曾经认为,当活动A被另一个全屏活动B替换时,onStop()将调用A的回调.
这也反映在文档中:
活动的可见生命周期发生在对onStart()的调用和对onStop()的调用之间.在此期间,用户可以在屏幕上看到活动并与之交互.例如,当一个新活动开始并且这个活动不再可见时,会调用onStop().
然而,现在,我正在观察不同的行为(在Lollipop和Marshmallow上测试).
我开始AuthenticationActivity从HomeActivity和,尽管事实AuthenticationActivity是一个全屏幕活动,HomeActivity不停止.
在清单中声明这些活动:
<activity
android:name=".screens.home.activities.HomeActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:name=".screens.authentication.activities.AuthenticationActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:windowSoftInputMode="adjustResize"
android:theme="@style/AppTheme.Transparent"/>
Run Code Online (Sandbox Code Playgroud)
当活动切换时,这是我在logcat中观察到的:
11-28 10:16:31.443 15183-15183/somepackage I/LOG:: LifeCycle : activity (somepackage.screens.home.activities.HomeActivity@3561e8e1) paused
11-28 10:16:31.583 15183-15183/somepackage I/LOG:: LifeCycle : activity (somepackage.screens.authentication.activities.AuthenticationActivity@2bbdb20f) created
11-28 10:16:31.753 15183-15183/somepackage D/Activity: performCreate Call secproduct feature valuefalse
11-28 10:16:31.753 15183-15183/somepackage D/Activity: performCreate Call debug elastic valuetrue
11-28 10:16:31.753 15183-15183/somepackage D/AuthenticationActivity: onStart()
11-28 10:16:31.753 15183-15183/somepackage I/LOG:: LifeCycle : …Run Code Online (Sandbox Code Playgroud)