利用两个BrocastReceiver来保证同时只有一个实例在运行
来源:互联网 发布:汤姆汉克斯的地位知乎 编辑:程序博客网 时间:2024/06/04 18:24
因为公司项目的特殊性,会有同时几个插件在用户的手机上但又必须保证只有一个实例在运行,当其中那个在运行插件被卸载后,其他插件可以检测到并把自己运行起来。由于之前的方式很耗性能,需要去扫描用户手机上所有的进程,并根据变量去判断优先级,优先级高的运行起来。这种方法不可取。
因为广播是跨进程的,只要注册了相同的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
- 利用两个BrocastReceiver来保证同时只有一个实例在运行
- 保证应用程序只有一个实例在运行
- 保证应用程序只有一个实例在运行
- 保证应用程序只有一个实例在运行
- 保证应用程序只有一个实例在运行
- 保证应用程序只有一个实例在运行
- 保证应用程序只有一个实例在运行
- 如何保证同时只有一个程序在系统中运行
- 保证只有一个实例运行
- 保证C#应用程序只有一个实例在运行
- VC保证应用程序只有一个实例在运行
- 保证某一执行文件只有一个实例在运行
- 保证应用程序只有一个实例在运行——VS2008
- VC保证应用程序只有一个实例在运行
- C#利用Mutex互斥量实现同时只有一个进程实例在运行
- 保证应用程序只有一个实例运行.txt
- 保证程序只有一个运行实例
- 保证当前只有一个程序在运行
- 制作验证码
- OC_NSTimeZone
- 最牛逼android上的图表库MpChart(一) 介绍篇
- java多态-示例
- 如何绘制caffe网络训练曲线
- 利用两个BrocastReceiver来保证同时只有一个实例在运行
- 性能测试计划的纲要
- React生命周期
- android实现一张或多张图片压缩并保持清晰上传
- 剑指offer39--翻转单词和左旋转字符串
- PushNotification消息推送逻辑
- Android 在代码中为textview设置自定义的颜色
- 013--Floyd算法-动态规划-《算法设计技巧与分析》M.H.A学习笔记
- Spring jar 包作用