android中实现多个apk文件。

在大型项目中,若各个模块相互独立,可将每个模块作为单独APK处理。本文介绍如何在Android项目中集成这些APK。首先,将各模块的APK放入项目的assets目录。接着,通过Java代码进行详细操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有时一个大项目下面会有很多个小模块,如果小模块之间没有联系,这时可以将每个小模块作为单独的项目,生成apk。

这时就涉及到怎么将多个apk放到一个项目中。

首先,将小模块生成的apk放到项目的assets文件夹中


java代码:

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();
					}
				}

			}
		}
	}
}

主页面的
main.xml文件:

<?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>


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值