android 类似QQ 换皮肤 实现思路 apk资源共享

原文: http://t80t90s.com/view.asp?id=23


1、首先在AndroidManifest.xml中的<manifest>中加入android:sharedUserId="共享id"----具有相同id的apk可以不受限制访问。

2、根据包名创建Context,在Activity下有提供方法createPackageContext能够依据包名创建。

3、获取共享的Apk资源。

注意:

1、Activity中的findViewById()与View中的findViewById()区别在于:

Activity需要对setContextView()后的Layout才能由findViewById()获得View。

View只需要有对象即可由findViewById()获得在View中包含id的View。

2、在资源获取方面主要获取那个apk下的资源主要是由Context决定。


在资源apk没安装前:

资源文件安装后:


主apk包名:com.app.share;

资源apk包名:com.app.share2;

主Activity中获取资源apk中R,并且生成Layout对id为button1的按钮设置监听。

view plain
  1. publicclassStartActextendsActivity {

  2. /** Called when the activity is first created. */

  3. @Override

  4. publicvoidonCreate(Bundle savedInstanceState) {

  5. super.onCreate(savedInstanceState);

  6. // setContentView(R.layout.main);

  7. Button btn =newButton(this);

  8. btn.setText("TO SECOND");

  9. btn.setOnClickListener(newOnClickListener() {

  10. @Override

  11. publicvoidonClick(View v) {

  12. // TODO Auto-generated method stub

  13. Intent intent =newIntent(StartAct.this, SecontAct.class);

  14. StartAct.this.startActivity(intent);

  15. }

  16. });

  17. this.setContentView(btn);

  18. try{

  19. Context other =this.createPackageContext("com.app.share2", CONTEXT_IGNORE_SECURITY|CONTEXT_INCLUDE_CODE);

  20. Class<?> c = other.getClassLoader().loadClass("com.app.share2.R");

  21. Class<?>[] cl = c.getClasses();

  22. intb =0;

  23. for(inti =0; i < cl.length; i++) {

  24. Log.d("TAG", cl[i].getSimpleName());

  25. Field field[] = cl[i].getFields();

  26. for(intj =0; j < field.length; j++) {

  27. Log.d("TAG","NAME:"+field[j].getName()+"--VALUE:"+field[j].getInt(field[j].getName()));

  28. if(field[j].getName().equals("button1")) {

  29. b = field[j].getInt(field[j].getName());

  30. Log.d("TAG","--------id");

  31. }

  32. };

  33. }

  34. View v = LayoutInflater.from(other).inflate(R.layout.main,null);

  35. Button btn1 = (Button) v.findViewById(b);

  36. btn1.setOnClickListener(newOnClickListener() {

  37. @Override

  38. publicvoidonClick(View v) {

  39. // TODO Auto-generated method stub

  40. Log.d("TAG","BUTTON FROM Share2");

  41. Toast.makeText(StartAct.this,"BUTTON FROM Share2", Toast.LENGTH_SHORT).show();

  42. }

  43. });

  44. this.setContentView(v);

  45. }catch(NameNotFoundException e) {

  46. // TODO Auto-generated catch block

  47. e.printStackTrace();

  48. }catch(ClassNotFoundException e) {

  49. // TODO Auto-generated catch block

  50. e.printStackTrace();

  51. }catch(IllegalArgumentException e) {

  52. // TODO Auto-generated catch block

  53. e.printStackTrace();

  54. }catch(IllegalAccessException e) {

  55. // TODO Auto-generated catch block

  56. e.printStackTrace();

  57. }

  58. }

  59. }


资源apk包Layout view plain
  1. <?xmlversion="1.0"encoding="utf-8"?>

  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

  3. android:orientation="vertical"

  4. android:layout_width="fill_parent"

  5. android:layout_height="fill_parent"

  6. >

  7. <TextView

  8. android:layout_width="fill_parent"

  9. android:layout_height="wrap_content"

  10. android:text="Share2"

  11. />

  12. <Buttonandroid:text="Button"android:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"></Button>

  13. </LinearLayout>

更多相关文章

  1. 【阿里云镜像】切换阿里巴巴开源镜像站镜像——Debian镜像
  2. ListView setOnItemClickListener无效原因详细分析
  3. Android~使用Service还是Thread
  4. Android(安卓)Studio中获取sha1证书的方法
  5. ListView setOnItemClickListener无效原因分析
  6. Android中使用ViewPager制作广告栏滚屏效果
  7. Android应用实例之----基于Service与ContentProvider的音乐播放
  8. Xml解析之----Pull
  9. android binder机制之--(创建binder服务)

随机推荐

  1. Android中的资源分析
  2. Android适合手机开发的又一力证——安卓
  3. Android开发者必知的开发资源
  4. Android(安卓)GIF 编解码
  5. 【如何在不同Android设备中得到有效的Aud
  6. Android高手进阶教程(二十三)之---Androi
  7. Google Android开发精华教程
  8. Intent组件
  9. 2014非常好用的开源Android测试工具
  10. Android架构师素养