首先要说的是这是一个比较流氓的办法,会被手机管家等软件检测到有一个后台服务在跑,会提示用户去清除。除非必要,不然还是考虑其他方法吧。
应用场景:
没有退出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掉。