利用两个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

0 1
原创粉丝点击