ps:安装成功是有广播的,这里只介绍安装界面关闭的监听,曲线可以监听取消按钮(不通过 startActivityForResult())
大家都知道通过startActivityForResult()方法唤起系统的安装页面,通过 onActivityResult方法收到安装页面的取消事件。
但有些场景并不希望通过startActivityForResult()方式来唤起安装页面,例如想在service中唤起,并在service中收到事件的结果。
例如:要安装A.apk,唤起系统安装界面的时候启动一个计时器,每隔1或者2秒 查询一次 当前App是否在前台,是的话意味着结束了安装界面,再判断本地的packageinfo中是否包含A.apk的相关信息,如果没有就可以认为 是用户取消了安装。
代码
/**
* 关于唤起系统安装界面的代码就不贴。。
* 唤起系统安装界面的同时调用这个方法 启动计时器
* 回到前台,也就是安装页面消失后发送msg
*/
private void startInstallTimer(final TaskInfo info) {
mInstallTimer = new Timer();
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
if (isForeground()) {
Message message = Message.obtain();
message.obj = info;
message.what = MSG_WHAT_CANCEL_NOTIFYCATION; // 結束了安裝,發送到主線程做自己的逻辑 例如判断 本地packageinfo是否有要安装的apk信息,有的话 安装成功,没有就是用户取消了安装或者直接关闭了安装界面
mHandler.sendMessage(message);
}
}
};
mInstallTimer.schedule(timerTask, 1000, 1000);//
}
// 停止定时器
private void stopInstallTimer() {
if (mInstallTimer != null) {
mInstallTimer.cancel();
mInstallTimer = null;
}
}
private boolean isForeground() {
ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
ComponentName cn = am.getRunningTasks(1).get(0).topActivity;
String currentPackageName = cn.getPackageName();
if (!TextUtils.isEmpty(currentPackageName) && currentPackageName.equals(getPackageName())) {
return true;
}
return false;
}