欢迎转载,转载标明http://blog.csdn.net/ning_gg/article/details/51271962
有那么一些app,在使用的过程中需要安装另一个app,安装完之后再次点击就跳到了另一个app,但是在桌面上看不到该app的图标。换句话说另一个app完成成了主app的一个功能,虽然我不喜欢这么做,但是有些app已经这么做了,所以我们还是要搞懂他们怎么实现的。
我写了两个demo 一个A,一个B,A是主程序,我把B的apk文件放入到A的assets文件夹下,当然实际应用的时候B的apk文件可以放到网上,A去下载,那样减少A的体积。A里有一个按钮,点击按钮,如果B已经安装上了直接跳到B,如果B没安装就先安装B,再次点击就跳到B。好了,原理说清了,那开始实现吧。
手机在A的onCreate中把assets里面的B拷贝到SDCard下,A不能直接装assets里面的apk,不然会出现文件解析错误。先拷贝,下面附上拷贝的方法。
/**
* 将assets下的apk复制到sdcard上 安装程序不能直接安装assets下的apk
* @param context
* @param fileName assets下的文件名
* @param path 需要拷贝的路径
* @return
*/
public boolean copyApkFromAssets(Context context, String fileName, String path) {
boolean copyIsFinish = false;
try {
InputStream is = context.getAssets().open(fileName);
File file = new File(path);
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
byte[] temp = new byte[1024];
int i = 0;
while ((i = is.read(temp)) > 0) {
fos.write(temp, 0, i);
}
fos.close();
is.close();
copyIsFinish = true;
} catch (IOException e) {
e.printStackTrace();
}
return copyIsFinish;
}
然后绑定A里面的button onclick方法实现,同样附上代码
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.jia:
//com.example.jia B的包名
//com.example.jia.MainActivity B的MainActivity
ComponentName cn = new ComponentName(
"com.example.jia","com.example.jia.MainActivity");
intent.setComponent(cn);
intent.setAction("android.intent.action.MAIN");
try {
startActivityForResult(intent, RESULT_OK);
} catch (Exception e) {
Intent intent1 = new Intent(Intent.ACTION_VIEW);
intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent1.setDataAndType(Uri.parse("file://" + Environment.getExternalStorageDirectory().getAbsolutePath()+"/jia.apk"),
"application/vnd.android.package-archive");
startActivity(intent1);
}
break;
default:
break;
}
}
安装跳转ok了,然后还有最后一步我们不需要在桌面上显示B的icon,所以在B的mainfest文件中把这行注释掉
<category android:name="android.intent.category.LAUNCHER" />
好了,功能都在这里了,其实我不是很喜欢写文字,我觉得代码加上注释就完全能看懂了。还有代码是用eclipse写的,下回还是坚决用studio吧,那个代码复制上来更好看点。
差点忘了这个demo还有个问题我没有搞定,就是当用户卸载A的时候,按照日常习惯B也要跟着A卸载的,但是我的只是卸载了A,B还在系统里,如果你解决了这个问题请告诉我,不甚感激。
还是附上A和B的工程吧,传送门
欢迎转载,转载标明http://blog.csdn.net/ning_gg/article/details/51271962