标签: activity-lifecycle

Android可以"杀死"活动而不会杀死应用程序吗?

我们知道,这样的场景在Android的默认流调用活动的各个onSaveInstanceState,onStop,onDestroy释放参考之前方法Activity的对象.

然而,似乎我有一个案例,当我的应用程序在后台,活动被杀死而没有调用那些方法,但我的应用程序本身不会被破坏.

但是我无法强制重现这一点.每当我在前台使用需要大量资源的应用程序时,整个过程都会被杀死,而不仅仅是活动.

哪种让我感到惊讶,因为我认为低资源上的'app kill'基本上只是旧的信号方式,Android系统是否会在不调用这些方法的情况下立即"杀死"(释放)一项活动?还是我在追逐鬼魂?

android activity-lifecycle android-activity

8
推荐指数
1
解决办法
1890
查看次数

活动停止时Dagger 2保存并恢复状态

我陷入了僵局.我正在使用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)

android state activity-lifecycle dagger-2

8
推荐指数
1
解决办法
1560
查看次数

Android中的Launcher + singleTask活动

我在项目中启动活动时遇到问题.

我的"主页"活动(H)允许选择其中的一些服务.假设S11-> ...-> S1n是服务的活动流程(S1).H是我的应用程序的LAUNCHER活动.

此外,我需要从H切换到另一个应用程序并返回到它.由于我无法更改该应用程序行为,因此我必须将我的H活动声明为"singleTask",以防止在我的活动堆栈中有多个实例.

问题是我的应用程序无法在不切断H之后推送的活动的情况下重新启动.因此,例如,如果我有H-S11-S12,然后按HOME并从最近的应用程序菜单重新启动,我将H作为前台活动.

有任何想法吗?有没有办法让这个组合起作用?谢谢!

android activity-lifecycle

7
推荐指数
1
解决办法
515
查看次数

电池耗尽时会调用哪些Android方法?

当我的Android设备上的电池在活动和片段类(如果有的话)用什么方法在设备的"关闭"阶段被称为?

此外,如果用户当前正在查看我的应用程序中的屏幕,并且他们按住电源按钮并选择关闭,那么当电池电量耗尽并自动关闭时,调用/未调用的事件是否一致?

在onPause?

调用OnStop?

的OnDestroy?

OnDetach?

额外奖励:我是否有足够的时间将少量数据保存到Web服务器?

为了澄清当设备的电池"完全"死亡时"死亡",不再接受输入,屏幕上会弹出一个消息框/加载屏幕,显示"电源关闭".设备关闭后不久就会出现.

我只是需要足够的时间来保存手机关机之前的状态,我有一个策略来清理保存的数据,如果手机没有关闭,但我想尽可能接近手机关闭(任何超过一分钟真是无意义).

java android activity-lifecycle android-lifecycle android-activity

7
推荐指数
1
解决办法
1020
查看次数

哪里可以使用onSaveInstanceState,其中参数传递的是不同的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)

那么,在什么情况下这两种方法都可以使用?请详细说明.提前致谢.

android activity-lifecycle android-activity

7
推荐指数
2
解决办法
1823
查看次数

Android - 在销毁一个Activity后,isFinishing()的值是否仍然为true?

如果这个问题听起来非常基本,请道歉.我有一个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)

android activity-lifecycle

7
推荐指数
1
解决办法
2554
查看次数

Android活动中onCreate方法第二次实现的用法是什么?

我总是onCreateActivity生命周期内使用方法从保存状态启动或恢复,但最近发现还有另一个onCreate方法,其中包含PersistableBundle:

@Override
public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
    super.onCreate(savedInstanceState, persistentState);

}
Run Code Online (Sandbox Code Playgroud)

我发现自Android 21以来它已被添加.

有人可以在电话和使用时提供有关此方法的完整信息吗?

android activity-lifecycle android-activity

7
推荐指数
1
解决办法
992
查看次数

活动创建两次

我设置了锁定方向

在此输入图像描述

并添加了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 screen-orientation activity-lifecycle

7
推荐指数
1
解决办法
1226
查看次数

Android视图 - 活动中自动保存和恢复的内容

我是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小部件中的文本值).

默认实现保存/恢复元素视图的所有状态.

android activity-lifecycle android-savedstate

7
推荐指数
2
解决办法
5565
查看次数

活动何时可见?在 onStart() 或 onResume() 之后?

文档说:

活动的可见生命周期发生在对 的调用和对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

6
推荐指数
1
解决办法
858
查看次数