从瓶颈到精通——Android四大组件:Service

今天记录一篇关于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的使用技巧,还是要多加练习

如有什么问题,可以在博客下方留言

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值