如何 “快速” 的监听应用安装完成,并将应用打开的问题?

最近做项目时,有这样一个需求,我的程序提供应用的下载,我希望在应用下载安装完成后能以最快的速度去将他启动起来。
现在我这边实现的情况就是
public void onReceive(final Context context, Intent intent) {

  
// TODO Auto-generated method stub
String action = intent.getAction();
String packageName = intent.getDataString();
if (packageName != null && packageName.length() > 0)
packageName = packageName.substring(8);
String type = null;
if (action.equals("android.intent.action.PACKAGE_ADDED")) {

Log.e(CommonUtil.TAG, "MyBroadcastReceiver : **** checked app install packageName :"
+ packageName + "*****");
type = "install";
} else {
Log.e(CommonUtil.TAG,
" MyBroadcastReceiver : **** checked app uninstall packageName :"
+ packageName + " ****");
type = "uninstall";
}

openApp(context, type, packageName);//打开应用程序
}

通过packageName 去启动一个程序,靠的是系统散播的应用安装的完成广播,经过我测试,这样的打开一个应用的速度取决于android系统散出这个广播 和 我们接收到广播的时间, 某些机型上边能实现在相对比较短(1秒钟之内)接收到广播, 但是有些机型接收到这个应用安装完成的广播就比较长(2-6秒),这样导致程序很不稳定的感觉,不知道各位有什么好的建议不。 希望大家能指点下

许磊
许磊
218
编辑于2012-05-25
评论 (1)链接2012-02-27 
  • 0 支持
    这个问题有一定挑战性 – 李剑波 2012-02-27

提供一个思路,控制应用程序数据库,如果count改变的话就遍历看是否有你安装的程序,有的话就打开。这样就不取决广播时间。每个机型上操纵算法什么都有dalvik速度决定,达到统一。

查看源码后总结一下我的答案:通过系统application的URI获取应用程序数据库,对其注册contentObserver监听该数据库的变化,可以准确知道系统是否安装了程序或者卸载了程序。具体的代码如下:

  
Cursor curso = getContentResolver().query(Uri.parse("content://applications/search/"), null, null, null, null);
getContentResolver().registerContentObserver(Uri.parse("content://applications/search/"),
true, contentObserver);
/*application数据库的字段不是很明朗,源码里面提供了三个字段,
* public interface ApplicationColumns extends BaseColumns {
public static final String NAME = "name";
public static final String ICON = "icon";
public static final String URI = "uri";
},虽然不多但是足够我们用,我们一般需要知道名字和uri*/
}
});
}

ContentObserver contentObserver = new ContentObserver(new Handler()) {

@Override
public boolean deliverSelfNotifications() {
// TODO Auto-generated method stub
return super.deliverSelfNotifications();
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
/*数据库改变了,需要做相应的操作,比如打开应用程序*/
}

};

这个是代码片段。

小飞
小飞
6832
编辑于 2012-03-02
该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (8)链接 • 2012-02-27
  • 1 支持
    终于找到application的库了,
    Cursor curso = getContentResolver().query(Uri.parse("content://applications/search/"), null, null, null, null);
    for(int i = 0;i<curso.getCount();i++){
    curso.moveToPosition(i);
    System.out.println("------------"+curso.getString(3));;
    }
    利用这段代码可以得到数据库,然后对其设置contentObserver,就可以监听到数据库的变化,就能很清楚地知道系统应用程序的改变了,包括安装,卸载等等。不过我暂时还不知道该数据库的字段信息,通过测试发现第一个字段应该是uuid,第4个字段是应用程序的名字。具体怎么扩展你们可以考虑一下。
    – 张炎Lior 2012-02-27
  • 0 支持
    就是接收到安装完成的广播信息的时间不一样, 我去实践下你提供的那个思路。 谢谢张兄弟了。 – 小包 2012-02-27
  • 0 支持
    高招,代验证。 – 李剑波 2012-02-27
  • 0 支持
    张兄弟啊,我试了下,content://applications/search/ 确实我application的库,我想这个库应该是提供给全局搜索框架搜索时使用的, 不过我自己写的ContentProvider 内容改变的监听,是否产生回调通知,这都是由我自己去实现的。 系统的这个散播通知了吗? 怎么我机子上 onChange的回调方法没有执行呢 – 小包 2012-02-27
显示更多隐藏的评论

不是您所需,查看更多相关问题与答案

德问是一个专业的编程问答社区,请 登录注册 后再提交答案