Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android應用Theme(二)

android應用Theme(二)

編輯:關於Android編程

第二種實現android應用Theme的方式是通過apk來實現的。下面是一個demo。

1.首先必須新建一個apk,類似的插件,然後在該apk的AndroidManifest.xml文件的application加上一個meta-data。這個是下一步查找是否是自己的插件的apk做一個標記。


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 mPluginPackageNameList = new ArrayList();
	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() {

			@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 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 == null)
				continue;
			meta = aInfo.metaData.getString("skin_demo2_plugin");
			if (meta == null || "".equals(meta))
				continue;
			if ("com.example.skindemo2.icon".equals(meta)) {
				//通過meta的值判斷是否是自己的插件apk
				mPluginPackageNameList.add(aInfo.packageName);
			}
		}
	}
	//必須在主線程中操作
	private void swtichImgUsePlugin() {
		//我這裡為了方便直接就取了第一個插件apk數據,實際中是通過用戶選擇的apk來切換
		if (mPluginPackageNameList.size() != 0) {
			try {
				//通過createPackageContext方法得到插件apk的context
				Context otherplusContext = context.createPackageContext(
						mPluginPackageNameList.get(0),
						Context.CONTEXT_INCLUDE_CODE
								| Context.CONTEXT_IGNORE_SECURITY);
				//通過得到插件apk的context類加載器,然後得到MainActvity的類對象
				Class mainClass = otherplusContext
						.getClassLoader()
						.loadClass(mPluginPackageNameList.get(0) + ".MainActivity");
				//通過反射得到相應位置的drawable
				Method m = mainClass.getMethod("getDrawableIdForOtherApp",
						int.class);
				int imgBgId = (Integer) m.invoke(mainClass.newInstance(), position);
				//為了可以循環切換img
				 if(imgBgId == 0){
					 position = 0;
				 }else{
					 position += 1;
				 }
				 //得到drawable對象
				Drawable drawable = otherplusContext.getResources()
						.getDrawable(imgBgId);
				mShowImg.setImageDrawable(drawable);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

	}
}





  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved