今天记录一篇关于Service的文章
1.Service的一般使用
2.startService和bindService的区别
3.多进程下使用Service
4.Service中引用一个windowManager
1.Service的一般使用
Service继承自ContextWrapper,表明它本身也是一个Context。了解它的继承关系更有利于了解Service
Service也有自己的生命周期
onCreate:Service的初始化
onStart:启动服务
onStartCommand:开始服务
onDestroy:销毁服务
onLowMemory:
在系统内存不足,所有后台程序(优先级为background的进程,不是指后台运行的进程)都被杀死时,系统会调用OnLowMemory。
onTrimMemory:
OnTrimMemory的参数是一个int数值,代表不同的内存状态:
TRIM_MEMORY_COMPLETE:内存不足,并且该进程在后台进程列表最后一个,马上就要被清理
TRIM_MEMORY_MODERATE:内存不足,并且该进程在后台进程列表的中部。
TRIM_MEMORY_BACKGROUND:内存不足,并且该进程是后台进程。
TRIM_MEMORY_UI_HIDDEN:内存不足,并且该进程的UI已经不可见了。
onBind:绑定事务(Activity与Service通信时用到)
onUnbind:解除绑定
onRebind:重新绑定(再次绑定)
生命周期的流程这里不做详述了。
可参考其他博客
2.startService和bindService的区别
http://blog.csdn.net/dfskhgalshgkajghljgh/article/details/51471108
3.多进程下使用Service
多进程(IPC机制)有很多办法可以实现:sharedpreferences、File、广播、AIDL
选用AIDL基本可以满足所有的业务需求,推荐使用AIDL
<service android:name="com.augustine.service.WindowViewService"
android:process=":windowService"/>
android:process 的作用就是开启一个独立的进 : 的后面是进程的名字
注意:
1.新开进程后,Application会被多次执行(每启用一个进程都会重新走Application)
2.static变量失效(都不在一个内存了,当然失效)
AIDL在AndroidStudio下使用,传送门
http://blog.csdn.net/j275183662/article/details/52637160
4.Service中引用一个windowManager
Service中引用一个windowManager可以实现很多功能,比如:悬浮窗、提示框等等,当一个Service中持有一个windowManager当然可以干很多事情了。。。
实现起来也是比较简单,这里贴出代码
public class WindowViewService extends Service implements Runnable{
private Thread pollThread;//循环线程
private WindowManager windowManager;
private WindowManager.LayoutParams layoutParams;
private View contentView;
@Override
public void onCreate() {
super.onCreate();
init();
}
private void init(){
contentView = View.inflate(getApplicationContext(), R.layout.view_window,null);
pollThread = new Thread(this);
windowManager = (WindowManager) getApplication().getSystemService(getApplication().WINDOW_SERVICE);
layoutParams = new WindowManager.LayoutParams();
layoutParams.gravity = Gravity.RIGHT;
layoutParams.type = WindowManager.LayoutParams.TYPE_PHONE;
layoutParams.format = PixelFormat.TRANSLUCENT;
layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
layoutParams.width = 50;
layoutParams.height = 55;
windowManager.addView(contentView,layoutParams);
pollThread.start();
onTouch();
}
private int downX,downY;
private int moveX,moveY;
private void onTouch(){
contentView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
downX = (int) event.getX();
downY = (int) event.getY();
break;
case MotionEvent.ACTION_MOVE:
moveX = (int) event.getX();
moveY = (int) event.getY();
layoutParams.x = moveX;
layoutParams.y = moveY;
windowManager.updateViewLayout(contentView,layoutParams);
break;
case MotionEvent.ACTION_UP:
downX = 0;
downY = 0;
moveX = 0;
moveY = 0;
break;
}
return true;
}
});
}
@Override
public void onDestroy() {
if(windowManager != null){
windowManager.removeView(contentView);
}
if(pollThread != null){
pollThread.destroy();
}
super.onDestroy();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void run() {
for(;;){
Log.i("WindowViewService","线程");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.GET_TASKS" />
总结
灵活使用Service是必备技能,本篇就讲述了Service的使用技巧,还是要多加练习
如有什么问题,可以在博客下方留言