我们知道,这样的场景在Android的默认流调用活动的各个onSaveInstanceState,onStop,onDestroy释放参考之前方法Activity的对象.
然而,似乎我有一个案例,当我的应用程序在后台,活动被杀死而没有调用那些方法,但我的应用程序本身不会被破坏.
但是我无法强制重现这一点.每当我在前台使用需要大量资源的应用程序时,整个过程都会被杀死,而不仅仅是活动.
哪种让我感到惊讶,因为我认为低资源上的'app kill'基本上只是旧的信号方式,Android系统是否会在不调用这些方法的情况下立即"杀死"(释放)一项活动?还是我在追逐鬼魂?
我陷入了僵局.我正在使用Dagger 2进行依赖注入,但是当应用程序进入后台时,我正在失去状态.这是场景:应用程序启动并创建依赖项.只要应用程序停留在前台,所有功能都可以完美运行.但是,有一种情况是应用程序必须进入后台.当它返回时,存储在我注入的一个类中的值将丢失.
对于我没有自己依赖的注入类,一切似乎都恢复正常.但是,有一个注入类具有注入依赖项,而这是一个无法恢复的类.这是我如何设置它:
AppComponent.java
@Singleton
@Component(
modules = {
AppModule.class
}
)
public interface AppComponent {
SessionKeyExchangerService provideSessionKeyExchangerService();
AESCipherService provideCipherService();
void inject(LoginActivity loginActivity);
}
Run Code Online (Sandbox Code Playgroud)
AppModule.java
@Module
public class AppModule {
@Provides @Singleton
AESCipherService provideCipherService() {
return new AESCipherService();
}
@Provides @Singleton
SessionKeyExchangerService provideSessionKeyExchangerService(AESCipherService service) {
return new SessionKeyExchangerService(service);
}
}
Run Code Online (Sandbox Code Playgroud)
然后,当我去注入这些依赖项时,我这样做:
LoginActivity.java
@Inject
SessionKeyExchangerService sessionKeyExchangerService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
Injector.INSTANCE.getAppComponent().inject(this);
if (savedInstanceState != null) {
sessionKeyExchangerService = savedInstanceState.getParcelable(SESSION_KEY_PARCEL);
Log.d(Constants.TAG, "session key retrieved in on create: " …Run Code Online (Sandbox Code Playgroud) 我在项目中启动活动时遇到问题.
我的"主页"活动(H)允许选择其中的一些服务.假设S11-> ...-> S1n是服务的活动流程(S1).H是我的应用程序的LAUNCHER活动.
此外,我需要从H切换到另一个应用程序并返回到它.由于我无法更改该应用程序行为,因此我必须将我的H活动声明为"singleTask",以防止在我的活动堆栈中有多个实例.
问题是我的应用程序无法在不切断H之后推送的活动的情况下重新启动.因此,例如,如果我有H-S11-S12,然后按HOME并从最近的应用程序菜单重新启动,我将H作为前台活动.
有任何想法吗?有没有办法让这个组合起作用?谢谢!
当我的Android设备上的电池死在活动和片段类(如果有的话)用什么方法在设备的"关闭"阶段被称为?
此外,如果用户当前正在查看我的应用程序中的屏幕,并且他们按住电源按钮并选择关闭,那么当电池电量耗尽并自动关闭时,调用/未调用的事件是否一致?
在onPause?
调用OnStop?
的OnDestroy?
OnDetach?
额外奖励:我是否有足够的时间将少量数据保存到Web服务器?
为了澄清当设备的电池"完全"死亡时"死亡",不再接受输入,屏幕上会弹出一个消息框/加载屏幕,显示"电源关闭".设备关闭后不久就会出现.
我只是需要足够的时间来保存手机关机之前的状态,我有一个策略来清理保存的数据,如果手机没有关闭,但我想尽可能接近手机关闭(任何超过一分钟真是无意义).
java android activity-lifecycle android-lifecycle android-activity
对于Acitivity,已经存在一个名为onSaveInstacestate(Bundle)的方法,该方法用于存储被覆盖方法的活动数据.
正如我所看到的,有两个不同的onSaveInstanceState,其中参数的传递方式如下所示.
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState)
{
super.onSaveInstanceState(outState, outPersistentState);
Log.i("test", "onSaveInstanceState called **********");
}
Run Code Online (Sandbox Code Playgroud)
和
@Override
protected void onSaveInstanceState(Bundle outState)
{
super.onSaveInstanceState(outState);
Log.i("test", "onSaveInstanceState with bundle only called");
}
Run Code Online (Sandbox Code Playgroud)
那么,在什么情况下这两种方法都可以使用?请详细说明.提前致谢.
如果这个问题听起来非常基本,请道歉.我有一个Activity异步网络回调.用户离开Activity后可以执行回调.
作为我想要使用的支票isFinishing()(我不能使用,isDestroyed()因为我的最低API级别是16而不是17 isDestroyed()需要).
我可以isFinishing()在回调中使用以确保我的逻辑仅在Activity未被销毁时执行吗?
更具体地说isFinishing(),finish()即使在调用之后调用销毁的Activity也会返回true onDestroy()?
我也看了一下源代码.这是isFinishing():
public boolean isFinishing() {
return mFinished;
}
Run Code Online (Sandbox Code Playgroud)
这里是finish(),其中变量设置为true:
/**
* Finishes the current activity and specifies whether to remove the task associated with this
* activity.
*/
private void finish(boolean finishTask) {
if (mParent == null) {
int resultCode;
Intent resultData;
synchronized (this) {
resultCode = mResultCode;
resultData = mResultData;
}
if (false) Log.v(TAG, "Finishing self: token=" …Run Code Online (Sandbox Code Playgroud) 我总是onCreate在Activity生命周期内使用方法从保存状态启动或恢复,但最近发现还有另一个onCreate方法,其中包含PersistableBundle:
@Override
public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
super.onCreate(savedInstanceState, persistentState);
}
Run Code Online (Sandbox Code Playgroud)
我发现自Android 21以来它已被添加.
有人可以在电话和使用时提供有关此方法的完整信息吗?
我设置了锁定方向
并添加了2个简单类的示例代码,如下所示:
SplashLandscapeActivity.java
public class SplashLandscapeActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("start", "xxxx start Activity SplashLandscapeActivity");
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
startActivity(new Intent(SplashLandscapeActivity.this, TestActivity.class));
finish();
}
}, 500);
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("start", "xxxx onDestroy Activity SplashLandscapeActivity");
}
}
Run Code Online (Sandbox Code Playgroud)
TestActivity.java
public class TestActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("start", "xxxx start Activity TestActivity "
+ getResources().getConfiguration().orientation);
}
@Override
protected void onDestroy() …Run Code Online (Sandbox Code Playgroud) 我是Android的初学者.
在Android中,一些通用元素可以在onSaveInstanceState/中自动保存/恢复onRestoreInstanceState.
例如,EditText保存/恢复Text属性,RatingBar保存/恢复Rating属性...
我从一些测试中看到,但我在文档中找不到任何相关内容.
如果没有我的干预,我怎么能知道隐含地保存/恢复了什么?
例如,我可以找到EditText.Text自动保存/恢复的地方?
我特别不想测试所有属性.
从JRG回复编辑:
https://developer.android.com/guide/components/activities/activity-lifecycle.html
保存活动状态当您的活动开始停止时,系统将调用onSaveInstanceState()方法<...>此方法的默认实现保存有关活动视图层次结构状态的瞬态信息,例如EditText小部件中的文本或ListView小部件的滚动位置.
我怎么知道保存/恢复的默认实现是什么?
重读JRG后的第二次编辑回答:
默认情况下,系统使用Bundle实例状态来保存有关活动布局中每个View对象的信息(例如输入到EditText小部件中的文本值).
默认实现保存/恢复元素视图的所有状态.
文档说:
活动的可见生命周期发生在对 的调用和对
onStart()的相应调用之间onStop()。
同样在这个你可以看到:
该
onStart()调用使用户可以看到该活动...
所以我认为 Activity 的 UI 在从onStart().
最近为了测试,我把一个无限循环放入onResume()并猜测Activity的UI必须是可见的。但是启动Activity的结果是一个没有任何UI的白色窗口。
所以看起来 Activity 的 UI 在从 返回onResume()而不是从 返回后是可见的onStart()。这是真的?如果是,为什么文档会说这种误导性的陈述?
编辑:
你可能会像 Công H?i那样认为:
我认为文档中提到的窗口可见不可见。
但我不认为“能见度”就是上面提到的“白窗”;因为如果你在 中放置一个无限循环onCreate(),再次启动 Activity 的结果将是一个白色窗口,而正如文档所说,onCreate()它不在 Activity 的“可见生命周期”中。所以“活动的可见性”必须意味着不同于“白色窗口”的另一件事。
编辑2
除了官方文档,许多教程都说 Activity 将通过调用可见并通过调用onStart()进行交互onResume()。他们都说不正确的话没有测试吗?
android onstart onresume activity-lifecycle android-activity