如何让Android应用一直活着,确保占用系统资源。

首先要说的是这是一个比较流氓的办法,会被手机管家等软件检测到有一个后台服务在跑,会提示用户去清除。除非必要,不然还是考虑其他方法吧。

应用场景:
没有退出App而是回到home或是进入到其它App后,系统自动回收了我App的资源,导致我再次回到我的App中时发现必须重新启动,而需求是不想每次都重新启动,需要能立即恢复到原来的状态。

解决方案1:数据持久化,每次退出时保护现场,将需要的数据保存到本地,等进入app时取出数据取出数据。

缺点:麻烦,容易出错,遇到复杂的数据不好存储,app启动慢(看你如何操作数据)
优点:不占用系统资源,即使程序被完全退出,下次启动还是能恢复到退出时的样子。

解决方案2:给主Activity绑定一个前台服务,提高应用优先级。

又快又省事,效果还好,我当然选第二种。

1、创建服务。(关键代码在onCreate中,发送一个通知,在通知栏中占个位置).(ˇˍˇ) 想~更恶心一点就在onStartCommand里面最后return super.onStartCommand(intent, START_STICKY, startId);

public class GuardService extends Service {
    private static final String TAG = GuardService.class.getSimpleName();
    public Binder guardBinder;

    public GuardService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        return guardBinder;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Notification notification = new Notification(R.drawable.logo, "tricksText", System.currentTimeMillis());
        PendingIntent p_intent = PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), 0);
        notification.setLatestEventInfo(this, "Tittle", "ContentText", p_intent);
        Logger.d(TAG, String.format("notification = %s", notification));
        startForeground(0x1988, notification);   // notification ID: 0x1988, you can name it as you will.
    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}

2.在MainActivity中绑定这个服务

    private boolean mIsBound;


    private ServiceConnection mConnection = new ServiceConnection() {
        public void onServiceConnected(ComponentName className, IBinder service) {
        }

        public void onServiceDisconnected(ComponentName className) {
        }
    };

    void doBindService() {
        bindService(new Intent(MainActivity.this, GuardService.class), mConnection, Context.BIND_AUTO_CREATE);
        mIsBound = true;
    }

    void doUnbindService() {
        if (mIsBound) {
            // Detach our existing connection.
            unbindService(mConnection);
            mIsBound = false;
        }
    }
        @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        doBindService();
    }
        @Override
    protected void onDestroy() {
        doUnbindService();
        super.onDestroy();
    }

大功告成,可以去手机管家中清理一下垃圾,看看是否有提示你的App后台有个服务在跑。

拓展:
事实上这种方法只是提高了应用在系统中的优先级,并不能保证一定能让应用活着,如果用户通过手机管家等软件手动停止了你的服务,那么App就会被kill掉了。这里提供两种思路,供大家参考。
思路1:监听广播,比如屏幕锁的广播,每次解锁屏幕或锁定屏幕都绑定一次服务,反正服务是能重复绑定的。
思路2:再添加一个服务,这两个服务执行onDetroy方法时都会唤醒对方。这样就形成一个死循环,永远也别担心会被kill掉。

另外有个方法我没有试过,能提高服务的存活率:

private WakeLock mWakeLock;
// 申请设备电源锁,在服务start的时候
  private void acquireWakeLock()
  {
    if (null == mWakeLock)
    {
      PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
      mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, "LoginService");
      if (null != mWakeLock) {
        mWakeLock.acquire();
      }
    }
  }

  // 释放设备电源锁,在服务Destory的时候
  private void releaseWakeLock()
  {
    if (null != mWakeLock)
    {
      mWakeLock.release();
      mWakeLock = null;
    }
  }

这个方法是防止手机休眠。你的服务就会一直运行下去,不会被系统kill掉。

参考网址:http://bbs.pediy.com/showthread.php?p=1339137

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值