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