編輯:關於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; }
然後通過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 ArrayListmPluginPackageNameList = 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(); } } } }
主要思想:將一個view設計成多層:背景層,含中獎信息等;遮蓋層,用於刮獎,使用關聯一個Bitmap的Canvas在該Bitmap上,使用它的canvas.drawPat
基於Android 7.0源碼,分析zygote進程的啟動過程。??Zygote是由init進程通過解析init.zygoteXX.rc文件而創建的,其中的&ldquo
概要 當手機Modem狀態改變後會將狀態變化信息通知到上層,通過《Android 4.4 Kitkat Phone工作流程淺析(八)__Phone狀態分析》
開門見山:這裡給出rk 在cameraHAL層的camera數據結構:typedef struct FramInfo{ int phy_addr; int v