android中实现多个apk文件。
2016-02-25 12:52
786 查看
http://blog.csdn.net/zhuyouleixuexi/article/details/7450055
有时一个大项目下面会有很多个小模块,如果小模块之间没有联系,这时可以将每个小模块作为单独的项目,生成apk。
这时就涉及到怎么将多个apk放到一个项目中。
首先,将小模块生成的apk放到项目的assets文件夹中
java代码:
[html] view
plain
package cn.onecomm.zhenghe.activity;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends Activity {
private ImageView baoxian_zhushou;
ArrayList<String> packagNameList;
private MyReceiver receiver;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initpackagNameList();
// 监听系统新安装程序的广播
receiver = new MyReceiver();
IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);// 注册广播机制
filter.addDataScheme("package"); // 必须添加这项,否则拦截不到广播
registerReceiver(receiver, filter);
baoxian_zhushou = (ImageView) findViewById(R.id.baoxian_zhushou);
// 主页面小模块的图标
baoxian_zhushou.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// 检查是否已经安装
Log.d("time", "clicked start " + System.currentTimeMillis()
+ "");
boolean installed = detectApk("cn.oncomm.activity");
if (installed) {// 已经安装直接起动
Log.d("time", "getPackageManager start "
+ System.currentTimeMillis() + "");
Intent intent = new Intent();
// 组件名称,第一个参数是包名,也是主配置文件Manifest里设置好的包名 第二个是类名,要带上包名
intent.setComponent(new ComponentName("cn.oncomm.activity",
"cn.oncomm.activity.MailActivity"));
intent.setAction(Intent.ACTION_VIEW);
Log.d("time", "setAction start "
+ System.currentTimeMillis() + "");
startActivity(intent);
} else {// 未安装先安装
//
// get the cacheDir.
File fileDir = getFilesDir();
final String cachePath = fileDir.getAbsolutePath()
+ "/pingAnAccident3.0.apk";
retrieveApkFromAssets(MainActivity.this,
"pingAnAccident3.0.apk", cachePath);
showInstallConfirmDialog(MainActivity.this, cachePath);
}
}
});
}
// 捆绑安装
public boolean retrieveApkFromAssets(Context context, String fileName,
String path) {
boolean bRet = false;
try {
File file = new File(path);
if (file.exists()) {
return true;
} else {
file.createNewFile();
InputStream is = context.getAssets().open(fileName);
FileOutputStream fos = new FileOutputStream(file);
byte[] temp = new byte[1024];
int i = 0;
while ((i = is.read(temp)) != -1) {
fos.write(temp, 0, i);
}
fos.flush();
fos.close();
is.close();
bRet = true;
}
} catch (IOException e) {
Toast.makeText(context, e.getMessage(), 2000).show();
Builder builder = new Builder(context);
builder.setMessage(e.getMessage());
builder.show();
e.printStackTrace();
}
return bRet;
}
/**
*提示用户安装程序
*/
public void showInstallConfirmDialog(final Context context,
final String filePath) {
AlertDialog.Builder tDialog = new AlertDialog.Builder(context);
tDialog.setIcon(R.drawable.info);
tDialog.setTitle("未安装该程序");
tDialog.setMessage("请安装该程序");
tDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// 修改apk权限
try {
String command = "chmod " + "777" + " " + filePath;
Runtime runtime = Runtime.getRuntime();
runtime.exec(command);
} catch (IOException e) {
e.printStackTrace();
}
// install the apk.
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.parse("file://" + filePath),
"application/vnd.android.package-archive");
context.startActivity(intent);
}
});
tDialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
});
tDialog.show();
}
/**
* 检测是否已经安装
*
* @param packageName
* @return true已安装 false未安装
*/
private boolean detectApk(String packageName) {
return packagNameList.contains(packageName.toLowerCase());
}
private void initpackagNameList() {
// 初始化小模块列表
packagNameList = new ArrayList<String>();
PackageManager manager = this.getPackageManager();
List<PackageInfo> pkgList = manager.getInstalledPackages(0);
for (int i = 0; i < pkgList.size(); i++) {
PackageInfo pI = pkgList.get(i);
packagNameList.add(pI.packageName.toLowerCase());
}
}
/**
*
* 设置广播监听
*
*/
private class MyReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED)) {
String packName = intent.getDataString().substring(8);
Log.e(intent.getDataString() + "====", packName);
// package:cn.oncomm.activity cn.oncomm.activity
// packName为所安装的程序的包名
packagNameList.add(packName.toLowerCase());
// 删除file目录下的所有以安装的apk文件
File file = getFilesDir();
File[] files = file.listFiles();
for (File f : files) {
if (f.getName().endsWith(".apk")) {
f.delete();
}
}
}
}
}
}
主页面的
[html] view
plain
main.xml文件:
[html] view
plain
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layContain" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:orientation="horizontal">
<!-- android:background="#FFC0CB"-->
<LinearLayout android:id="@+id/layFirst"
android:layout_width="400px" android:layout_height="fill_parent"
android:orientation="vertical" android:layout_marginBottom="50dp">
<LinearLayout android:layout_width="fill_parent"
android:layout_height="fill_parent" android:orientation="vertical">
<LinearLayout android:layout_width="fill_parent"
android:layout_height="wrap_content" android:orientation="horizontal"
android:layout_marginTop="30dp">
<LinearLayout android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_weight="1"
android:gravity="center_horizontal" android:orientation="vertical">
<ImageView android:id="@+id/baoxian_zhushou"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:src="@drawable/icon" />
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="平安助手"
/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
有时一个大项目下面会有很多个小模块,如果小模块之间没有联系,这时可以将每个小模块作为单独的项目,生成apk。
这时就涉及到怎么将多个apk放到一个项目中。
首先,将小模块生成的apk放到项目的assets文件夹中
java代码:
[html] view
plain
package cn.onecomm.zhenghe.activity;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends Activity {
private ImageView baoxian_zhushou;
ArrayList<String> packagNameList;
private MyReceiver receiver;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initpackagNameList();
// 监听系统新安装程序的广播
receiver = new MyReceiver();
IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);// 注册广播机制
filter.addDataScheme("package"); // 必须添加这项,否则拦截不到广播
registerReceiver(receiver, filter);
baoxian_zhushou = (ImageView) findViewById(R.id.baoxian_zhushou);
// 主页面小模块的图标
baoxian_zhushou.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// 检查是否已经安装
Log.d("time", "clicked start " + System.currentTimeMillis()
+ "");
boolean installed = detectApk("cn.oncomm.activity");
if (installed) {// 已经安装直接起动
Log.d("time", "getPackageManager start "
+ System.currentTimeMillis() + "");
Intent intent = new Intent();
// 组件名称,第一个参数是包名,也是主配置文件Manifest里设置好的包名 第二个是类名,要带上包名
intent.setComponent(new ComponentName("cn.oncomm.activity",
"cn.oncomm.activity.MailActivity"));
intent.setAction(Intent.ACTION_VIEW);
Log.d("time", "setAction start "
+ System.currentTimeMillis() + "");
startActivity(intent);
} else {// 未安装先安装
//
// get the cacheDir.
File fileDir = getFilesDir();
final String cachePath = fileDir.getAbsolutePath()
+ "/pingAnAccident3.0.apk";
retrieveApkFromAssets(MainActivity.this,
"pingAnAccident3.0.apk", cachePath);
showInstallConfirmDialog(MainActivity.this, cachePath);
}
}
});
}
// 捆绑安装
public boolean retrieveApkFromAssets(Context context, String fileName,
String path) {
boolean bRet = false;
try {
File file = new File(path);
if (file.exists()) {
return true;
} else {
file.createNewFile();
InputStream is = context.getAssets().open(fileName);
FileOutputStream fos = new FileOutputStream(file);
byte[] temp = new byte[1024];
int i = 0;
while ((i = is.read(temp)) != -1) {
fos.write(temp, 0, i);
}
fos.flush();
fos.close();
is.close();
bRet = true;
}
} catch (IOException e) {
Toast.makeText(context, e.getMessage(), 2000).show();
Builder builder = new Builder(context);
builder.setMessage(e.getMessage());
builder.show();
e.printStackTrace();
}
return bRet;
}
/**
*提示用户安装程序
*/
public void showInstallConfirmDialog(final Context context,
final String filePath) {
AlertDialog.Builder tDialog = new AlertDialog.Builder(context);
tDialog.setIcon(R.drawable.info);
tDialog.setTitle("未安装该程序");
tDialog.setMessage("请安装该程序");
tDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// 修改apk权限
try {
String command = "chmod " + "777" + " " + filePath;
Runtime runtime = Runtime.getRuntime();
runtime.exec(command);
} catch (IOException e) {
e.printStackTrace();
}
// install the apk.
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.parse("file://" + filePath),
"application/vnd.android.package-archive");
context.startActivity(intent);
}
});
tDialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
});
tDialog.show();
}
/**
* 检测是否已经安装
*
* @param packageName
* @return true已安装 false未安装
*/
private boolean detectApk(String packageName) {
return packagNameList.contains(packageName.toLowerCase());
}
private void initpackagNameList() {
// 初始化小模块列表
packagNameList = new ArrayList<String>();
PackageManager manager = this.getPackageManager();
List<PackageInfo> pkgList = manager.getInstalledPackages(0);
for (int i = 0; i < pkgList.size(); i++) {
PackageInfo pI = pkgList.get(i);
packagNameList.add(pI.packageName.toLowerCase());
}
}
/**
*
* 设置广播监听
*
*/
private class MyReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED)) {
String packName = intent.getDataString().substring(8);
Log.e(intent.getDataString() + "====", packName);
// package:cn.oncomm.activity cn.oncomm.activity
// packName为所安装的程序的包名
packagNameList.add(packName.toLowerCase());
// 删除file目录下的所有以安装的apk文件
File file = getFilesDir();
File[] files = file.listFiles();
for (File f : files) {
if (f.getName().endsWith(".apk")) {
f.delete();
}
}
}
}
}
}
主页面的
[html] view
plain
main.xml文件:
[html] view
plain
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layContain" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:orientation="horizontal">
<!-- android:background="#FFC0CB"-->
<LinearLayout android:id="@+id/layFirst"
android:layout_width="400px" android:layout_height="fill_parent"
android:orientation="vertical" android:layout_marginBottom="50dp">
<LinearLayout android:layout_width="fill_parent"
android:layout_height="fill_parent" android:orientation="vertical">
<LinearLayout android:layout_width="fill_parent"
android:layout_height="wrap_content" android:orientation="horizontal"
android:layout_marginTop="30dp">
<LinearLayout android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_weight="1"
android:gravity="center_horizontal" android:orientation="vertical">
<ImageView android:id="@+id/baoxian_zhushou"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:src="@drawable/icon" />
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="平安助手"
/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
相关文章推荐
- Android Studio、GenyMotion、VirtualBox安装问题
- Volley的简要说明-android
- Android中popupWindow点击外面区域以及返回键,使popupWindow消失的方法
- Android Studio2.0模拟器最新预览版发布说明
- 编译Android 5.1.1源码
- Android安全攻防战,反编译与混淆技术完全解析(上)
- Android中.9图片的了解和制作过程
- Cordova cannot add Android failed with exit code ENOENT
- Android各个API版本
- Android 自用各种插件
- Android之MediaPlayer播放音乐并实现进度条实例
- 一个超炫的listview
- Android图片编辑
- Android 的Paint(画笔)及Canvas(画布)
- android CountDownTimer定时器实现连续单击监听
- android:clipToPadding和android:clipChildren
- Android中Fragment与Activity的生命周期对比
- android自定义adapter之简单写法
- Android如何防止apk程序被反编译
- Android--自定义tab+viewPager