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);
}
}
}
阅读全文
0 0
- bind 一个存在的service的流程
- service存在的目的
- 判断一个指定的Service是否存在的方法
- git上传一个已存在的项目流程
- Android使用service的bind方式使用服务的使用需要注意的一个问题
- 源码 service 的bind工作过程
- 安卓服务——bind service一个绑定式的服务
- std::bind的一个例子
- 四大组件之Service(一)-双子座的Service-Start Service与Bind Service
- Android中bindService的细节之二:从进程的角度分析绑定Service的流程【Service所在进程已存在】
- Android Service 的添加流程
- 3.service的使用流程
- 系统Service的启动流程
- Service的启动流程分析
- 继承存在时的程序执行流程
- Android入门-Service-start,end,bind,unbind之间的区别
- activity绑定(bind)service的执行顺序
- 通过bind实现activity与service的交互
- Android各种帮助开发工具
- PowerManager规则
- volatile关键字
- Android的画布,具体数据去画
- linux学习第二十九篇:linux网络相关,防火墙:firewalld和netfilter,netfilter5表5链介绍,iptables语法
- bind 一个存在的service的流程
- 595. Big Countries
- android 利用superuser编写使用root权限的app
- extern C的作用详解
- JNI的两种方式
- Android开发调试性能分析工具:dumpsys
- 云计算、虚拟化、容器化杂谈
- 跟踪Android callback 调用堆栈
- Python 从入门到放弃(一)