App在后台被杀死后重启-重进首页方法

感谢这位哥的思路。

这个问题很常见,基本所有app都会遇到这个问题。但是很多开发者都没有处理。

问题的起因:我的app在进入后台后一段时间,可能被系统干掉了,然后通过多任务键,或者图标再点进去操作,出现xxId为null

经过一番探索发现:

app在被系统干掉后,重新进入,是会实例出所有的界面(因为他们都重写了onsaveInstance方法),但是这个界面所有的变量都变为null了(如果没有自己保存的话)。

解决的办法2种

1.每个页面都去重写onsaveInstace方法,去保存数据(对于老项目来说,这个工程量是非常巨大的)(如果是新项目,建议用一个好的框架,统一处理每一个页面变量的存取)

2.比较取巧的办法就是在被干掉重启的时候,重新进入SplashActivity(也就是启动页)。重走一遍流程,数据也就肯定不会出错了(ios系统上,如果出现被系统干掉的情况,也是采用的这种方法)

本文主要就是介绍第二种办法:

原理:

1.在splashActivity的oncreate时候就设置一个全局的变量值。

2.在baseActivity的oncreate中比较这个变量值是否发生变化(app在后台被干掉后重进,该值会变为默认)

3.如果发生了改变,就重进splashActivity,如果没有就正常处理

工具类一个:

/**
 * 这个类的作用是保证app进入后台被系统回收之后,再次进入app时重首页进入。
 * 配合splashactivity和baseactivity使用
 */
public class RestartUtils {
    public static final int STATUS_FORCE_KILLED = -1;//应用在后台被强杀了
    public static final int STATUS_NORMAL = 2; //APP正常态
    public static final String START_LAUNCH_ACTION = "start_launch_action";

    private int appStatus = STATUS_FORCE_KILLED; //默认为被后台回收了

    private static RestartUtils appStatusManager;

    public static RestartUtils getInstance() {
        if (appStatusManager == null) {
            appStatusManager = new RestartUtils();
        }
        return appStatusManager;
    }

    public int getAppStatus() {
        return appStatus;
    }

    public void setAppStatus(int appStatus) {
        this.appStatus = appStatus;
    }

}

BaseActivity里面:

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        switch (RestartUtils.getInstance().getAppStatus()) {
            case STATUS_FORCE_KILLED:
                Log.d("thisttt" , "BaseModuledActivity-STATUS_FORCE_KILLED");
                restartApp();
                break;
            case STATUS_NORMAL:
                Log.d("thisttt" , "BaseModuledActivity-STATUS_NORMAL");
                break;
            default:
                break;
        }
    }

    private void restartApp() {
        Intent intent = new Intent(this,MainActivity.class);
        intent.putExtra(START_LAUNCH_ACTION,STATUS_FORCE_KILLED);
        startActivity(intent);
    }

SplashActivity里面:

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        RestartUtils.getInstance().setAppStatus(STATUS_NORMAL);
        Log.d("thisttt" , "SplashActivity-setAppStatus");
        super.onCreate(savedInstanceState);
    }

注意事项有3点:

1.所有的activity包括SplashActivity都需要继承BaseActivity

2.SplashActivity的onCreate中,先设置setAppStatus()。再super.onCreate().

3.首页activity必须singtask(首页activity一般是SplashActivity下一个页面。具体看自己是否免登陆,免登陆就是MainActivity。不免登陆就是LoginActivity)

测试(模拟内存不足,被系统干掉):

很多帖子说用开发者模式的 不保留活动测试,是错误的。下面介绍不保留活动的特效

  • 保留app内存数据(全局的单例等),
  • 保留activity堆栈数据,
  • 再次开启app,会调用onCreate()重新创建栈顶的activity,

所以内存数据还是在的。

正确的办法是开发者模式->后台进程数限制->2个进程->然后开几个其他应用,你的应用就被干掉了。

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当 Android 应用程序被用户手动杀死时,应用程序会收到 `onDestroy()` 生命周期回调函数。但是,在这种情况下,您无法阻止应用程序被杀死。因此,如果您希望在应用程序被杀死时执行某些操作,例如重新启动应用程序或发送通知等,您需要使用一些其他方法。 一种方法是使用 Android 的 `Service` 组件。通过创建一个 `Service`,您可以在应用程序被杀死后在后台继续运行代码。要监听应用程序被杀死的事件,您可以在 `Service` 中实现 `onTaskRemoved()` 方法。 在 `onTaskRemoved()` 方法中,您可以执行您希望在应用程序被杀死时执行的操作。例如,您可以使用 `PendingIntent` 发送一个通知,提示用户重新启动应用程序。 以下是一个示例代码片段,演示如何在 `Service` 中监听应用程序被杀死的事件: ```java public class MyService extends Service { @Override public void onCreate() { super.onCreate(); // 在此处执行任何必要的初始化操作 } @Override public int onStartCommand(Intent intent, int flags, int startId) { // 在此处执行您希望在后台运行的代码 return START_STICKY; } @Override public void onTaskRemoved(Intent rootIntent) { // 在此处执行您希望在应用程序被杀死时执行的操作 super.onTaskRemoved(rootIntent); } @Override public IBinder onBind(Intent intent) { // 如果您的 Service 不提供绑定,则返回 null return null; } } ``` 请注意,使用 `Service` 可能会对设备的电池寿命产生影响。如果您希望在应用程序被杀死时执行某些操作,但不需要在后台运行代码,请考虑使用 Android 的 `AlarmManager` 和 `BroadcastReceiver` 组件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值