今天去面试,什么公司就不谈了,技术官直接就上需求让我思考一下,自己就写了一个小demo,效果还可以,奉献一下,源码要的邮箱,我就不上传了。
按照惯例先贴出需求:
需求:
1.apk2终止时发送广播,apk1接受,然后启动apk2。
2.主动:当apk2被卸载后,apk1查询是否卸载,然后安装apk2。
3.被动:apk2当应用被卸载后,系统发出广播,apk1接受判断后安装apk2。
自己做了一个demo,效果如下:
1.安装test1后,点击button,开始检测test2,查的没有test2,开始下载。
2.下载test2后,退出test2,提示4秒后开启test2,test2开启。
3.卸载test2,提示test1已卸载,然后4秒后重装test2。
test1项目结构:
test2项目结构:
一,test1部分
MainActivity的代码如下:
public class MainActivity extends Activity implements OnClickListener,BRInteraction {
private Button app1Btn;
private MyReceiver myReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
initBroadcastReciver();
setListener();
}
------------------------------------------------------------
//初始化broadcastreceiver
private void initBroadcastReciver() {
IntentFilter intentFilter1 = new IntentFilter();
intentFilter1.addAction("app2isclosed");
IntentFilter intentFilter2 = new IntentFilter(); intentFilter2.addAction("android.intent.action.PACKAGE_REMOVED");
intentFilter2.addDataScheme("package");
myReceiver = new MyReceiver();
registerReceiver(myReceiver, intentFilter1);
registerReceiver(myReceiver, intentFilter2);
}
//初始化view
private void initViews() {
app1Btn = (Button) findViewById(R.id.app1_btn);
}
//设置监听
private void setListener() {
app1Btn.setOnClickListener(this);
myReceiver.setBRInteractionListener(this);
}
--------------------------------------------------
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.app1_btn:
switchApp2();
break;
default:
break;
}
}
//启动app2,如果没有开始下载
public void switchApp2() {
if (hasApplication()) {
ComponentName componetName = new ComponentName(
// 这个是另外一个应用程序的包名
"com.example.test2",
// 这个参数是要启动的Activity
"com.example.test2.MainActivity");
Intent intent = new Intent();
intent.setComponent(componetName);
startActivity(intent);
} else {
Toast.makeText(MainActivity.this, "没有安装test2,正在安装", Toast.LENGTH_LONG)
.show();
installApk();
}
}
//下载app2
@Override
public void installApk() {
new Handler().postDelayed(new Runnable() {
public void run() {
slientInstall(); // 未安装进行安装
}
}, 2 * 1000);
}
//判断是否存在test2
public boolean hasApplication() {
PackageMa