bind 一个存在的service的流程

来源:互联网 发布:深圳人众软件 编辑:程序博客网 时间:2024/06/14 06:28
以bind  systemUI中截屏操作的service为例:

首先:
final Object mScreenshotLock = new Object();
//保存一些连接中的状态
ServiceConnection mScreenshotConnection = null;

加入一个bind的timeout机制
 final Runnable mScreenshotTimeout = new Runnable() {
     @Override public void run() {
         synchronized (mScreenshotLock) {
             if (mScreenshotConnection != null) {
                 if(DEBUG) Log.d(TAG, "---grabFlag set false timeout.");
                 grabFlag = false;
                 unbindService(mScreenshotConnection);
                 mScreenshotConnection = null;
             }
         }
     }
 };

//bindService 和发送截屏请求一气呵成
 // Assume this is called from the Handler thread.
 private void takeScreenshot() {
     synchronized (mScreenshotLock) {
         if (mScreenshotConnection != null) {
             return;
         }
         if(DEBUG) Log.d(TAG, "---takeScreenshot-----");
         moveFlag = false;
         ComponentName cn = new ComponentName("com.android.systemui",
                 "com.android.systemui.screenshot.TakeScreenshotService");
         Intent intent = new Intent();
         intent.setComponent(cn);
         ServiceConnection conn = new ServiceConnection() {
             @Override
             public void onServiceConnected(ComponentName name, IBinder service) {
                 synchronized (mScreenshotLock) {
                     if (mScreenshotConnection != this) {
                         return;
                     }
                     Messenger messenger = new Messenger(service);
                     Message msg = Message.obtain(null, 1);
                     final ServiceConnection myConn = this;
                     Handler h = new Handler(mHandler.getLooper()) {
                         @Override
                         public void handleMessage(Message msg) {

                                //收到请求处理成功的返回。
                             synchronized (mScreenshotLock) {
                                 if (mScreenshotConnection == myConn) {
                                    if(DEBUG) Log.d(TAG, "---grabFlag set false ok");
                                     grabFlag = false;
                                     unbindService(mScreenshotConnection);
                                     mScreenshotConnection = null;
                                     mHandler.removeCallbacks(mScreenshotTimeout);
                                 }
                             }
                         }
                     };
                     msg.replyTo = new Messenger(h);
                     msg.arg1 = msg.arg2 = 0;

                         msg.arg1 = 1;

                         msg.arg2 = 1;
                     try {

                        if(DEBUG) Log.d(TAG, "---LogControlerService---send--message---");
                         //发送载屏请求
                         messenger.send(msg);
                     } catch (RemoteException e) {
                     }
                 }
             }

             @Override
            public void onServiceDisconnected(ComponentName name) {}
        };
        if (bindService(
                intent, conn, Context.BIND_AUTO_CREATE, UserHandle.USER_CURRENT)) {
            mScreenshotConnection = conn;
           //加入一个10s的超时确定在没有bind上时做现场清理。
            mHandler.postDelayed(mScreenshotTimeout, 10000);
        }
    }
}




原创粉丝点击