首页 > 代码库 > android应用Theme(二)

android应用Theme(二)

第二种实现android应用Theme的方式是通过apk来实现的。下面是一个demo。

1.首先必须新建一个apk,类似的插件,然后在该apk的AndroidManifest.xml文件的application加上一个meta-data。这个是下一步查找是否是自己的插件的apk做一个标记。

<meta-data android:name="skin_demo2_plugin" android:value=http://www.mamicode.com/"com.example.skindemo2.icon"/>>2.在该apk添加一些图片,也可以用其他(包括style等)这里主要是为了演示。在该apk的MainActivity定义一个方法。这里主要为了方便主apk快速调用这个方法。

static int allDrawableId[] = {R.drawable.img_apparel_accessories,R.drawable.img_computers_software
		,R.drawable.img_electro,R.drawable.img_electronics,R.drawable.img_entertaiment
		,R.drawable.img_food_beverage,R.drawable.img_kids_baby,R.drawable.img_sport,R.drawable.img_toys_games};
	
	public int getDrawableIdForOtherApp(int position){
		
		if(position < allDrawableId.length){
			return allDrawableId[position];
		}
		return 0;	
	}

3.在主apk中通过读取所有安装的应用,通过分析applicationInfo的meta-data,然后判断是否是自己的插件apk。

然后通过context.createPackageContext(packageName,int flag)得到相应插件的context。然后通过类加载器得到MainActivity的class类,然后通过反射得到方法返回的值。然后就可以得到drawable对象。

package com.example.skindemo2;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.drawable.Drawable;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends Activity {

	private Button mSwtichImgBgBtn;
	private ImageView mShowImg;
	private Context context;
	private ArrayList<String> mPluginPackageNameList = new ArrayList<String>();
	private int position = 0;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		context = this;
		mSwtichImgBgBtn = (Button) this.findViewById(R.id.swtichImgBgBtn);
		mSwtichImgBgBtn.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				swtichImgUsePlugin();
			}
		});
		mShowImg = (ImageView) this.findViewById(R.id.myShowImg);
		new AsyncTask<Void, Void, Void>() {

			@Override
			protected Void doInBackground(Void... params) {
				findPluginPackageName();
				return null;
			}
			
			@Override
			protected void onPostExecute(Void result) {
				swtichImgUsePlugin();
				super.onPostExecute(result);
			}
		}.execute();

	}

	private void findPluginPackageName() {
		PackageManager pm = context.getPackageManager();
		List<PackageInfo> list = pm.getInstalledPackages(0);//得到所有安装的apk的PackageInfo
		String meta = null;
		ApplicationInfo aInfo = null;
		for (PackageInfo pi : list) {
			String pkgName = pi.packageName;
			try {
				aInfo = pm.getApplicationInfo(pkgName,
						PackageManager.GET_META_DATA);
			} catch (NameNotFoundException e) {
				e.printStackTrace();
			}
			if (aInfo == null || aInfo.metaData =http://www.mamicode.com/= null)>