把图片放到SQLITE数据库里面去?通过CONTENT PROVIDER方式?但这样每个AP都要去读IMAGE啊,IMAGE也会被加载多次

解决方案 »

  1.   

    google一下 "android shareduserid"
    可以实现apk间数据共享
      

  2.   

    把图片打包成JAR文件应该也解决不了这个问题!!!打包成JAR每个AP必须去包含这个JAR文件才可以访问里面的东西。
      

  3.   

    不用啊,比如你的A程序里,有100张图片,那你肯定是编译A程序的时候把图片都放在drawable目录下了,这样资源里肯定有这些图片,然后通过定义一致的shareduserid,其他你的程序就可以直接打开A的资源句柄了,然后就能访问A里的这100张图片了啊。
      

  4.   

    Android-sharedUserId数据权限
    http://wallage.blog.163.com/blog/static/17389624201011010539408/
    Android给每个APK进程分配一个单独的用户空间,其manifest中的userid就是对应一个Linux用户
    (Android 系统是基于Linux)的.
    所以不同APK(用户)间互相访问数据默认是禁止的.
    但是它也提供了2种APK间共享数据的形式:
    1. Share Preference. / Content Provider
    APK可以指定接口和数据给任何其他APK读取. 需要自己实现接口和Share的数据.
    本文对于这个不做详细解释2. Shared User id
    通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中.所以默认就是
    可以互相访问任意数据. 也可以配置成运行成不同的进程, 同时可以访问其他APK的数据目录下的
    数据库和文件.就像访问本程序的数据一样.
    比如某个公司开发了多个Android 程序, 那么可以把数据,图片等资源集中放到APK  A中去. 然后
    这个公司的所有APK都使用同一个User ID, 那么所有的资源都可以从APK A中读取.举个例子:
    APK A 和APK B 都是C公司的产品,那么如果用户从APK A中登陆成功.那么打开APK B的时候就不用
    再次登陆. 具体实现就是 A和B设置成同一个User ID:
        * 在2个APK的AndroidManifest.xml 配置User ID:
        <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
        package="com.android.demo.a1"
        android:sharedUserId="com.c">
       这个"com.c" 就是user id, 然后packagename APK A就是上面的内容,  APK B可能
       是"com.android.demo.b1" 这个没有限制这个设定好之后, APK B就可以像打开本地数据库那样 打开APK A中的数据库了.
    APK A把登陆信息存放在A的数据目录下面. APK B每次启动的时候读取APK A下面的数据库
    判断是否已经登陆:
    APK B中的代码:
                friendContext = this.createPackageContext(
                        "com.android.demo.a1",
                        Context.CONTEXT_IGNORE_SECURITY);
    通过A的package name 就可以得到A的 packagecontext
    通过这个context就可以直接打开数据库
      

  5.   

    Android 给应用定制皮肤-------值得一看http://www.iandroid.cn/bbs/viewthread.php?tid=675
    public class main extends Activity {        /** Called when the activity is first created. */        private LinearLayout showBg;        private Button btn;        private Context green_skin_Context = null;        private Context black_skin_Context = null;        int flag = 0;        @Override        public void onCreate(Bundle savedInstanceState) {                super.onCreate(savedInstanceState);                setContentView(R.layout.main);                showBg = (LinearLayout) findViewById(R.id.linear_layout_1);                try {                        green_skin_Context = this.createPackageContext(                                        "com.eric.greenskin", Context.CONTEXT_IGNORE_SECURITY);                } catch (NameNotFoundException e) 
                    {                        e.printStackTrace();                }                try {                        black_skin_Context = this.createPackageContext(                                        "com.eric.blackskin", Context.CONTEXT_IGNORE_SECURITY);                } catch (NameNotFoundException e) {                        e.printStackTrace();                }                btn = (Button) findViewById(R.id.btn_change_skin);                btn.setOnClickListener(new OnClickListener() {                        @Override                        public void onClick(View v) {                                if (flag == 0) {                                        showBg.setBackgroundDrawable(green_skin_Context                                                        .getResources().getDrawable(R.drawable.bg));                                        btn.setBackgroundDrawable(green_skin_Context                                                        .getResources().getDrawable(R.drawable.btn_normal));                                                                                flag = 1;                                } else if (flag == 1) {                                        showBg.setBackgroundDrawable(black_skin_Context                                                        .getResources().getDrawable(R.drawable.bg));                                        btn.setBackgroundDrawable(black_skin_Context                                                        .getResources().getDrawable(R.drawable.btn_normal));                                        flag = 0;                                }                        }                });        }}
      

  6.   

    如何更换皮肤
    http://www.ophonesdn.com/forum/thread-2504-1-1.html
    要想做一个好的程序,皮肤也是很重要的额一部分,因为它是直接吸引用户的部分。像QQ,MSN,搜狗输入法等成功软件都有大量的皮肤供用户选择。 
    我们可以通过设置程序的主题和风格。但更换皮肤往往不止这些,它可能要更换更多的resources资源。这个程序只是说明更换皮肤的方法,代码很简单。包括两个工程,一个主工程,一个皮肤工程,负责更换皮肤。 
    代码介绍如下: 
    1.主程序: 
    package com.D_skinMain; import android.app.Activity; 
    import android.content.Context; 
    import android.content.pm.PackageManager.NameNotFoundException; 
    import android.os.Bundle; 
    import android.view.View; 
    import android.view.View.OnClickListener; 
    import android.widget.Button; 
    import android.widget.ImageButton; 
    import android.widget.LinearLayout; 
    import android.widget.TextView; public class D_skinMain extends Activity { 
            /** Called when the activity is first created. */ 
            private LinearLayout showBg; 
            private Context friendContext = null; 
            private int flag = 0; 
            private TextView info; 
            @Override 
            public void onCreate(Bundle savedInstanceState) { 
                    super.onCreate(savedInstanceState); 
                    setContentView(R.layout.main); 
                    
                    info = (TextView) findViewById(R.id.info); 
                    info.setText("skin1"); 
                    showBg = (LinearLayout) findViewById(R.id.showbg); 
                    showBg.setBackgroundResource(R.drawable.background);                 try { 
                            friendContext = this.createPackageContext( 
                                            "com.D_skin", 
                                            Context.CONTEXT_IGNORE_SECURITY); 
                    } catch (NameNotFoundException e) { 
                            e.printStackTrace(); 
                    }                 Button btn = (Button) findViewById(R.id.btn); 
                    btn.setOnClickListener(new OnClickListener(){                         @Override 
                            public void onClick(View v) { 
                                    if(flag == 0){ 
                                    showBg.setBackgroundDrawable(friendContext.getResources().getDrawable(R.drawable.background)); 
                                    flag = 1; 
                                    info.setText("skin2"); 
                                    }else if (flag == 1) { 
                                            showBg.setBackgroundResource(R.drawable.background); 
                                            flag = 0; 
                                            info.setText("skin1"); 
                                    } 
                                    
                            } 
                            
                    }); 
            } 

    2 皮肤程序: 
    package com.D_skin; import android.app.Activity; 
    import android.os.Bundle; public class D_skin extends Activity { 
        /** Called when the activity is first created. */ 
        @Override 
        public void onCreate(Bundle savedInstanceState) { 
            super.onCreate(savedInstanceState); 
            setContentView(R.layout.main); 
        } 

    嘿嘿,简单吧! 3.manifest.xml文件 
    <?xml version="1.0" encoding="utf-8"?> 
    <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
          package="com.D_skin" 
          android:versionCode="1" 
          android:versionName="1.0" 
          android:sharedUserId="com.D_skinMain.skin"> 
        <application android:icon="@drawable/icon" android:label="@string/app_name"> 
            <activity android:name=".D_skin" 
                      android:label="@string/app_name"> 
                <intent-filter> 
                    <action android:name="android.intent.action.MAIN" /> 
                    <category android:name="android.intent.category.LAUNCHER" /> 
                </intent-filter> 
            </activity>     </application> 
        <uses-sdk android:minSdkVersion="3" /> </manifest> 4. 程序说明: 
    >要看这个程序的效果,必须装皮肤程序,否则点击换肤按钮后程序会爆掉,这个我没有修改,便于查看皮肤工程的作用。 
    >程序为通过按钮改变imageview的背景图片。图片名称为background.png 。其为2张图片,分别位于这两个工程中,点击主程序的换肤按钮,就加载skin工程中的背景图片资源进行更换,当然要真的做换肤的例子肯定不止这些资源,这里意在说明原理。 
    >程序的关键在于menifest中的 <android:sharedUserId="com.D_skinMain.skin">,SharedUserid 
    拥有同一个User id的多个APK可以配置成运行在同一个进程中,所以默认就是可以互相访问任意数据。也可以配置成运行成不同的进程,同时可以访问其他APK的数据目录下的数据库和文件,就像访问本程序的数据一样。 
    > 代码中的关键部分在于:friendContext = this.createPackageContext( 
                                            "com.D_skin", 
                                            Context.CONTEXT_IGNORE_SECURITY); showBg.setBackgroundDrawable(friendContext.getResources().getDrawable(R.drawable.background)); >附上这两个工程的打包文件,以便有兴趣的查看。:loveliness:
      

  7.   

    针对不同的APK,还是不要这样了。 因为这样APK之间就有依赖关系了。
      

  8.   


    试了一下,可是可以!但太死了,要访问B的资源,A中必须有一个同名的资源。要不然下面的访问非法。showBg.setBackgroundDrawable(friendContext.getResources().getDrawable(R.drawable.background)); 
    R.drawable.background这个只能访问本程序中的资源,修改成其它进程的资源名语法上是错误的。