在有些APP的开发过程中,需要在service中启动activity来开启相应的活动。
众所周知启动activity需要调用startActivity方法并传入intent,这个方法是属于context的,而activity、service都是context的子类,所以我们在一个activity中可以直接用这个方法,此时,startActivity和ExampleActivity.startActivity是一样的,简言之:ExampleActivity可以省略。
而在service中直接startActivity必须添加FLAG_ACTIVITY_NEW_TASK,否则会报异常,但是添加了之后会重新建立一个活动,相当于内存中有两个播放器同时存在了,所以这个时候可以使用handler。而handler中调用startActivity就需要context对象了,因此需要传入一个context对象,但是直接传进context的话需要handler非static修饰,这样由于handler不会随context的生命周期销毁,当它持有context的引用时,会造成系统就无法回收context的内存。
所以我们需要建一个static的handler来避免持有外部类的对象而导致该对象无法被系统回收内存,此时我们还需要传入context的话就可以使用弱引用的方法,使用此方法不会阻止系统回收内存,便不会导致内存泄漏了:
static class MyHandler extends Handler {
private final WeakReference<Context> mActivityRef;
SpHandler(Context context) {
mActivityRef = new WeakReference<>(context);
}
@Override
public void handleMessage(Message msg) {
final Context context = mActivityRef.get();
if (context == null) {
//此时context已被回收,所以handler无需持有此引用,直接return
removeCallbacksAndMessages(null);
return;
}
switch (msg.what) {
case 1:
Intent i = new Intent(context, NewActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
break;
case 2:
Log.d(TAG, "handleMessage: 2");
……
}
}
}
调用:MyHandler handler = new MyHandler(传入当前context即可);