android插件式开发是为了解决当我们一个app开发到一定阶段时,功能模块越来越多,apk安装包越来越大,为了在使用过程中,不需要下载整个apk,采用插件式开发,即将一个app的功能,划分为好几个app的功能组合。
关键需要我们在Mainfest配置清单文件中添加 android:shardUserId 这个节点。在主app和从app中分别配置 android:shardUserId 节点,且值要为相同的。这样在android的dalvik虚拟机中就可以让着两个独立的app看成是一个app应用。
1.主AndroidMainfest.xml
android:shardUserId要与从的一致
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.plugapp"
<span style="color:#ff0000;">android:sharedUserId="com.main"</span>
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="20" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
<action android:name=“”/> 要与从的Activity中一致
<category android:name="android.intent.category.DEFAULT" /> 一定要这么写
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.plugappactivity"
<span style="color:#ff0000;">android:sharedUserId="com.main"</span>
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<span style="color:#ff0000;"><action android:name="com.example.plugappactivity" /></span>
<span style="color:#ff0000;"><category android:name="android.intent.category.DEFAULT" /></span>
</intent-filter>
</activity>
</application>
</manifest>
3.main.xml(布局文件)
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.plugapp.MainActivity" >
<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="主界面" />
<LinearLayout
<span style="color:#ff0000;">android:id="@+id/llMainLayout"</span>
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_alignBaseline="@id/textview"
android:orientation="vertical" >
<Button
android:id="@+id/btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="查找插件" />
</LinearLayout>
</RelativeLayout>
4.声明个插件实体
/**
* 插件实体
*
* @author Administrator
*
*/
public class PluginBean {
public String packageName;
public String label;
public String getPackageName() {
return packageName;
}
public void setPackageName(String packageName) {
this.packageName = packageName;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
}
5.查找插件的方法
/**
* 查找插件
* @return
*/
private List<PluginBean> findPlugins() {
Log.i("findPlugins", "查找插件");
List<PluginBean> plugins = new ArrayList<PluginBean>();
// 遍历包名,来获取插件
PackageManager pm = getPackageManager();
List<PackageInfo> pkgs = pm
.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);
for (PackageInfo pkg : pkgs) {
// 包名
String packageName = pkg.packageName;
String sharedUserId = pkg.sharedUserId;
// sharedUserId是开发时约定好的,这样判断是否为自己人
// sharedUserId和包名(packageName)
if (!"com.main".equals(sharedUserId)
|| "com.example.plugapp".equals(packageName))
continue;
// 进程名
String prcessName = pkg.applicationInfo.processName;
// label,也就是appName了
String label = pm.getApplicationLabel(pkg.applicationInfo)
.toString();
PluginBean plug = new PluginBean();
plug.setLabel(label);
plug.setPackageName(packageName);
plugins.add(plug);
}
return plugins;
}
6.列举出插件
/**
* 列举出插件
* @param plugins
*/
private void attachPlugin(final List<PluginBean> plugins) {
Log.i("attachPlugin", "列举出插件");
this.plugins = plugins;
for (final PluginBean plugin : plugins) {
Button btn = new Button(this);
btn.setTextColor(Color.RED);
btn.setText(plugin.getLabel());
llMainLayout.addView(btn);
// 添加事件
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent it = new Intent();
it.setAction(plugin.getPackageName());
it.putExtra("data", "helloworld");
startActivity(it);
}
});
}
}
7.MainActivity.java中调用这些写好的方法
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
llMainLayout = (LinearLayout) findViewById(R.id.llMainLayout);
attachPlugin(findPlugins());
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
dialog = ProgressDialog.show(MainActivity.this, "提示", "查找插件中");
Thread thread = new Thread(MainActivity.this);
thread.start();
llMainLayout.removeAllViews();
llMainLayout.addView(btn);
attachPlugin(findPlugins());
}
});
}
效果图