利用两个BrocastReceiver来保证同时只有一个实例在运行
2016-06-28 12:05
591 查看
因为公司项目的特殊性,会有同时几个插件在用户的手机上但又必须保证只有一个实例在运行,当其中那个在运行插件被卸载后,其他插件可以检测到并把自己运行起来。由于之前的方式很耗性能,需要去扫描用户手机上所有的进程,并根据变量去判断优先级,优先级高的运行起来。这种方法不可取。
因为广播是跨进程的,只要注册了相同的action,无论是那个进程发送的广播,都可以接受到。利用这点,我们觉得是可以实现,多个插件存在的情况下 ,只有一个实例在运行。
实现思路如下:首先在插件启动的时候注册一个检测是否有高优先级存在的广播接受者
public void reqHightInstanceReceiver() {
// TODO Auto-generated method stub
IntentFilter filterhaha = new IntentFilter();
filterhaha.addAction("hightInstance_receiver");
mHightInstanceReceiver = new ExistHightInstanceReceiver();
mContext.registerReceiver(mHightInstanceReceiver,filterhaha);
}
接着:发送一个查询广播:
public void sendQueryBrocast(){
Intent intent = new Intent();
intent.setAction("query_receiver");
intent.putExtra("packname", mContext.getPackageName());
mContext.sendBroadcast(intent);
}如果此时没有其他插件存在,那么这个广播将没有响应。如果有其他插件存在则会响应,并把自己的包名作为额外数据传递给插件已启动就注册的广播:
class QueryReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent)
{
Intent tempIntent = new Intent();
tempIntent.setAction("hightInstance_receiver");
tempIntent.putExtra("packname", context.getPackageName());
mContext.sendBroadcast(tempIntent);
//SOkLog.i("Demo1", "QueryReceiver", context);
}
}
· 发送广播后,延时1.5秒后,获取是否有高优先级存在的变量,此时为false,即表示没有其他插件存在,刺客在注册另一个广播接受者:
public boolean isExistHightInstance(){
return isExistHightInstance;
}
public void reqQueryReceiver() {
// TODO Auto-generated method stub
IntentFilter filter = new IntentFilter();
filter.addAction("query_receiver");
mQueryReceiver = new QueryReceiver();
mContext.registerReceiver(mQueryReceiver,filter);
}
亲测:很稳定。大家可以借鉴,若有任何问题,请评论提问。最后附上源码下载链接
http://download.csdn.net/detail/leelizebo/9561664
因为广播是跨进程的,只要注册了相同的action,无论是那个进程发送的广播,都可以接受到。利用这点,我们觉得是可以实现,多个插件存在的情况下 ,只有一个实例在运行。
实现思路如下:首先在插件启动的时候注册一个检测是否有高优先级存在的广播接受者
public void reqHightInstanceReceiver() {
// TODO Auto-generated method stub
IntentFilter filterhaha = new IntentFilter();
filterhaha.addAction("hightInstance_receiver");
mHightInstanceReceiver = new ExistHightInstanceReceiver();
mContext.registerReceiver(mHightInstanceReceiver,filterhaha);
}
接着:发送一个查询广播:
public void sendQueryBrocast(){
Intent intent = new Intent();
intent.setAction("query_receiver");
intent.putExtra("packname", mContext.getPackageName());
mContext.sendBroadcast(intent);
}如果此时没有其他插件存在,那么这个广播将没有响应。如果有其他插件存在则会响应,并把自己的包名作为额外数据传递给插件已启动就注册的广播:
class QueryReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent)
{
Intent tempIntent = new Intent();
tempIntent.setAction("hightInstance_receiver");
tempIntent.putExtra("packname", context.getPackageName());
mContext.sendBroadcast(tempIntent);
//SOkLog.i("Demo1", "QueryReceiver", context);
}
}
· 发送广播后,延时1.5秒后,获取是否有高优先级存在的变量,此时为false,即表示没有其他插件存在,刺客在注册另一个广播接受者:
public boolean isExistHightInstance(){
return isExistHightInstance;
}
public void reqQueryReceiver() {
// TODO Auto-generated method stub
IntentFilter filter = new IntentFilter();
filter.addAction("query_receiver");
mQueryReceiver = new QueryReceiver();
mContext.registerReceiver(mQueryReceiver,filter);
}
亲测:很稳定。大家可以借鉴,若有任何问题,请评论提问。最后附上源码下载链接
http://download.csdn.net/detail/leelizebo/9561664
相关文章推荐
- java多态-示例
- 最牛逼android上的图表库MpChart(一) 介绍篇
- 最牛逼android上的图表库MpChart(一) 介绍篇
- 安卓网络请求之——OkHttp学习
- Unable to add window --token is not valid
- Redis的正确安装方式
- OC_NSTimeZone
- 软件生命周期
- C语言中字符串与整型,浮点型之间的转换
- MYSQL-----视图
- oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务。
- mysql基本sql语句大全(基础用语篇)
- JS之获取属性总结
- windows环境下VS2013编译openSSL
- Java NIO SocketChannel
- cuda中warp分支及执行
- 反转字符串 不同方式
- Shell while循环
- 二叉树及其应用--二叉树创建
- 44、JavaScript的运动----任意属性值的运动---应用