android中实现多个apk文件

android中实现多个apk文件  

2012-10-25 16:02:35|  分类: Android|字号 订阅

 
 

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

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

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

 

android中实现多个apk文件 - Figthing - Figthing的博客
 
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;

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

&nbsp;// 主页面小模块的图标
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();
}
}

}
}
}
}

主页面的
main.xml文件:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 一个Android应用可以分为多个APK文件,这是为了支持设备配置分层,使不同设备能够下载适合它们的APK,从而节省存储空间。例如,一个应用可以拆分为多个APK,每个APK分别专门针对不同的屏幕分辨率、架构等设备配置提供服务。在用户安装应用时,Google Play Store 会自动选择适合当前设备配置的APK下载并安装。 ### 回答2: Android一个APK多个APK是指在开发Android应用程序时,使用了动态特性来创建多个APK文件。这样做有多种原因和优势。 首先,一个APK多个APK可以帮助开发者解决应用程序过大的问题。随着应用程序功能的增加和迭代,APK文件可能会变得非常大,这会导致用户在下载和安装应用程序时需要较长的时间和较高的网络流量。而使用多个APK可以将应用程序拆分为不同的部分,根据用户的需求进行灵活下载和安装,从而减少APK文件的大小。 其次,一个APK多个APK还可以提供不同的应用程序体验。通过为应用程序的不同版本和不同设备创建不同的APK开发者可以根据用户的需求和设备的特性,提供特定的功能和优化的用户体验。比如,对于低端设备,可以提供精简版本的APK以提高性能和响应速度,而对于高端设备,则可以提供更多的功能和高级特性。 此外,一个APK多个APK还可以用于多语言支持。通过创建不同的APK来适配不同的语言版本,开发者可以在不同的国家和地区提供本地化的应用程序界面和文本内容,使用户可以更好地理解和使用应用程序。 总而言之,一个APK多个APK开发模式可以帮助开发者解决应用程序过大、提供灵活的下载和安装、提供不同的应用程序体验以及多语言支持等问题,提高应用程序的用户体验和适配性。 ### 回答3: Android的一个APK多个APK是指一种特殊的应用程序打包方式,它允许开发者将一个应用程序划分为多个APK包,以适应不同设备、不同配置和不同需求的用户。 通过一个APK多个APK的方式,开发者可以降低APK文件的大小,优化应用程序的性能,并提供更好的用户体验。 这种打包方式主要是通过Google Play市场的分发功能来实现的。开发者可以在Google Play开发者控制台定义应用程序的配置变体,例如不同的设备架构、多语言支持等。然后,当用户在Google Play上安装应用程序时,系统会根据用户设备的特性和设置,自动下载并安装适合的APK。 通过一个APK多个APK的方式,开发者可以根据设备的CPU架构,提供不同的二进制文件,以充分利用设备的处理能力。同时,开发者还可以根据用户所在的地区和语言偏好,提供相应的资源文件,包括文字、图像等,以确保应用程序的显示效果和可用性。 此外,通过这种方式,开发者还可以定义不同的应用程序配置选项,例如启用或禁用特定功能、使用不同的算法和算法库等。这样,用户可以根据自己的需求和喜好选择所需的APK包,以定制化自己的应用体验。 综上所述,一个APK多个APK的打包方式在Android应用开发具有重要的意义。它为开发者提供了更多的灵活性和可定制性,同时也提供了更好的用户体验和应用性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值