有时一个大项目下面会有很多个小模块,如果小模块之间没有联系,这时可以将每个小模块作为单独的项目,生成apk。
这时就涉及到怎么将多个apk放到一个项目中。
首先,将小模块生成的apk放到项目的assets文件夹中
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;
publicclassMainActivityextendsActivity{
privateImageView baoxian_zhushou;
ArrayList<String> packagNameList;
privateMyReceiver receiver;
publicvoid onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initpackagNameList();
// 监听系统新安装程序的广播
receiver =newMyReceiver();
IntentFilter filter =newIntentFilter(Intent.ACTION_PACKAGE_ADDED);// 注册广播机制
filter.addDataScheme("package");// 必须添加这项,否则拦截不到广播
registerReceiver(receiver, filter);
baoxian_zhushou =(ImageView) findViewById(R.id.baoxian_zhushou);
// 主页面小模块的图标
baoxian_zhushou.setOnClickListener(newOnClickListener(){
publicvoid 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 =newIntent();
// 组件名称,第一个参数是包名,也是主配置文件Manifest里设置好的包名 第二个是类名,要带上包名
intent.setComponent(newComponentName("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();
finalString cachePath = fileDir.getAbsolutePath()
+"/pingAnAccident3.0.apk";
retrieveApkFromAssets(MainActivity.this,
"pingAnAccident3.0.apk", cachePath);
showInstallConfirmDialog(MainActivity.this, cachePath);
}
}
});
}
// 捆绑安装
publicboolean retrieveApkFromAssets(Context context,String fileName,
String path){
boolean bRet =false;
try{
File file =newFile(path);
if(file.exists()){
returntrue;
}else{
file.createNewFile();
InputStreamis= context.getAssets().open(fileName);
FileOutputStream fos =newFileOutputStream(file);
byte[] temp =newbyte[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 =newBuilder(context);
builder.setMessage(e.getMessage());
builder.show();
e.printStackTrace();
}
return bRet;
}
/**
*提示用户安装程序
*/
publicvoid showInstallConfirmDialog(finalContext context,
finalString filePath){
AlertDialog.Builder tDialog =newAlertDialog.Builder(context);
tDialog.setIcon(R.drawable.info);
tDialog.setTitle("未安装该程序");
tDialog.setMessage("请安装该程序");
tDialog.setPositiveButton("确定",newDialogInterface.OnClickListener(){
publicvoid 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 =newIntent(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("取消",newDialogInterface.OnClickListener(){
publicvoid onClick(DialogInterface dialog,int which){
}
});
tDialog.show();
}
/**
* 检测是否已经安装
*
* @param packageName
* @return true已安装 false未安装
*/
privateboolean detectApk(String packageName){
return packagNameList.contains(packageName.toLowerCase());
}
privatevoid initpackagNameList(){
// 初始化小模块列表
packagNameList =newArrayList<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());
}
}
/**
*
* 设置广播监听
*
*/
privateclassMyReceiverextendsBroadcastReceiver{
publicvoid 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();
}
}
}
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns: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"-->
<LinearLayoutandroid:id="@+id/layFirst"
android:layout_width="400px"android:layout_height="fill_parent"
android:orientation="vertical"android:layout_marginBottom="50dp">
<LinearLayoutandroid:layout_width="fill_parent"
android:layout_height="fill_parent"android:orientation="vertical">
<LinearLayoutandroid:layout_width="fill_parent"
android:layout_height="wrap_content"android:orientation="horizontal"
android:layout_marginTop="30dp">
<LinearLayoutandroid:layout_width="wrap_content"
android:layout_height="wrap_content"android:layout_weight="1"
android:gravity="center_horizontal"android:orientation="vertical">
<ImageViewandroid:id="@+id/baoxian_zhushou"
android:layout_width="wrap_content"android:layout_height="wrap_content"
android:src="@drawable/icon"/>
<TextViewandroid:layout_width="wrap_content"
android:layout_height="wrap_content"android:text="平安助手"
/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
相关推荐
在Android平台上,实现从网络下载APK文件并自动执行安装是一个常见的需求,尤其在更新应用或者分发非市场应用时。这个过程涉及到多个步骤,包括网络请求、文件下载、权限处理以及安全检查。下面我们将详细讲解如何...
- 对于非预置应用,包含在APK文件中的DEX文件会在运行时被优化,优化后的文件将被保存在缓存中。 - **Dalvik虚拟机实例管理**:每个Android应用都在自己的Dalvik虚拟机实例中运行,每个实例都是一个独立的进程空间...
当用户下载一个APK文件后,Android系统会解析这个文件,并进行安装。 下载APK文件通常涉及到网络请求,我们可以使用Android提供的HttpURLConnection类或者第三方库如Volley、OkHttp来实现。下面以HttpURLConnection...
4.3 多重签名:某些情况下,开发者可能需要为同一个应用使用多个签名,例如为了兼容不同平台或实现不同的权限需求。 4.4 适配Android版本:了解并遵循每个Android版本对签名的要求,确保应用能在各个版本上正常运行...
### 删除Android模拟器中的.apk文件 在进行Android应用开发时,经常需要在模拟器上安装、测试并卸载各种.apk文件。然而,并不是所有开发者都熟悉如何有效地执行这一操作。本文将详细介绍如何在Android模拟器中删除....
在Android系统中,通常我们通过点击APK文件来安装应用,但有时可能需要在一个APK文件内部触发安装另一个或多个APK文件的操作。这在开发过程中可能会遇到,比如需要组合多个功能模块,或者进行更新时分包处理。本文将...
然后,将 android123.apk 文件复制到 Android SDK 的 Tools 目录中(点击下载 Android123.apk 文件),使用 cmd 的 cd 命令定位到 Android 模拟器目录 Tools 中,执行 adb install android123.apk 命令,这时模拟器...
综上所述,Android APK文件是Android系统中应用的核心载体,涉及到下载、安装、安全、开发等多个环节。无论是用户还是开发者,都需要对APK有一定的理解和操作能力,确保安全有效地使用和开发Android应用。而`...
在 Android 应用程序开发过程中,生成 APK 文件是一个非常重要的步骤。下面将详细介绍如何使用 Eclipse 生成 Android 程序 APK 文件。 什么是 APK 文件? APK 文件是 Android 包文件的缩写,它是 Android 应用程序...
2. **多线程下载**:多线程下载是通过同时从服务器获取多个数据块来提高下载速度的方法。在Android中,可以使用`AsyncTask`或自定义线程池实现这一功能。每个线程负责下载文件的一部分,然后将这些部分合并成完整的...
这个插件可以帮助自动化创建和打包多个APK。下载并导入OneForAllApk-master项目,按照其文档指示配置后,通过运行特定的任务,就可以快速生成多个不同配置的APK。 通过以上步骤,开发者可以在Android Studio中轻松...
此外,如果你需要批量处理多个APK文件,可以将上述过程封装成一个函数,接收APK文件路径和XML文件名作为参数,然后在循环中调用该函数。这样可以提高代码的复用性和效率。 总结来说,通过PHP的ZipArchive类,我们...
本文将深入探讨如何在Android应用中实现在弹出对话框中强制用户更新,并且支持断点续传技术,提高下载效率。 首先,我们要理解强制更新的基本流程。当用户打开应用时,应用会通过网络请求检查服务器上的最新版本...
这个过程涉及到多个Android系统级别的API和技术点,包括网络请求、文件下载、线程管理、通知栏管理和文件存储等。下面我们将详细探讨这些知识点。 首先,**网络请求与文件下载**是基础。在Android中,可以使用`...
这可以通过在.pro文件中添加或移除模块依赖来实现。 4. **版本控制与签名** 不同的Apk通常需要有不同的版本号和签名,以便在Google Play或其他应用市场上发布。在Qt项目中,你可以通过修改`android-manifest.xml`...
在Android应用开发中,保护APK文件中的代码和资源安全是非常重要的一步,因为源码如果不进行加密,可能会被恶意用户逆向工程分析,导致敏感信息泄露或者应用被篡改。本话题将深入探讨如何对Android APK文件进行代码...
"Android-世界上最小的Android APK"项目非常独特,它挑战了APK文件大小的极限,将一个完整的可运行应用压缩到了仅仅820字节。这样的成果在技术层面上具有极高的研究价值,因为它揭示了如何通过极致优化来减小应用...
在Android平台上,与U盘...总的来说,通过libaums库,Android应用可以方便地读取和写入U盘中的文件,为移动设备提供了更多扩展存储的可能性。不过,在实际开发中,务必注意处理好各种异常情况,确保用户数据的安全。
7. **分包安装**:Android 7.0还支持APK分包,大型应用可以分成多个小包进行安装,减少初始下载大小,提高用户体验。 8. **数据压缩**:系统在后台对APK进行解压,以节省存储空间,尤其是在设备存储空间有限的情况...
这种方法对于开发者来说非常方便,因为无需通过图形用户界面手动操作,可以批量或自动化安装多个APK。 总的来说,安装APK文件到Android模拟器是一个相对简单的过程,主要涉及启动模拟器、复制APK文件到相应目录、...