最近做项目时,有这样一个需求,我的程序提供应用的下载,我希望在应用下载安装完成后能以最快的速度去将他启动起来。
现在我这边实现的情况就是
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秒),这样导致程序很不稳定的感觉,不知道各位有什么好的建议不。 希望大家能指点下
提供一个思路,控制应用程序数据库,如果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);
/*数据库改变了,需要做相应的操作,比如打开应用程序*/
}
};
这个是代码片段。