今天记录一篇关于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的使用技巧,还是要多加练习
如有什么问题,可以在博客下方留言