Android下很多AP之间图片资源能不能共享?图片只加载一次但能被各个AP访问 把图片放到SQLITE数据库里面去?通过CONTENT PROVIDER方式?但这样每个AP都要去读IMAGE啊,IMAGE也会被加载多次 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 google一下 "android shareduserid"可以实现apk间数据共享 把图片打包成JAR文件应该也解决不了这个问题!!!打包成JAR每个AP必须去包含这个JAR文件才可以访问里面的东西。 不用啊,比如你的A程序里,有100张图片,那你肯定是编译A程序的时候把图片都放在drawable目录下了,这样资源里肯定有这些图片,然后通过定义一致的shareduserid,其他你的程序就可以直接打开A的资源句柄了,然后就能访问A里的这100张图片了啊。 Android-sharedUserId数据权限http://wallage.blog.163.com/blog/static/17389624201011010539408/Android给每个APK进程分配一个单独的用户空间,其manifest中的userid就是对应一个Linux用户(Android 系统是基于Linux)的.所以不同APK(用户)间互相访问数据默认是禁止的.但是它也提供了2种APK间共享数据的形式:1. Share Preference. / Content ProviderAPK可以指定接口和数据给任何其他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就可以直接打开数据库 Android 给应用定制皮肤-------值得一看http://www.iandroid.cn/bbs/viewthread.php?tid=675public 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; } } }); }} 如何更换皮肤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: 针对不同的APK,还是不要这样了。 因为这样APK之间就有依赖关系了。 试了一下,可是可以!但太死了,要访问B的资源,A中必须有一个同名的资源。要不然下面的访问非法。showBg.setBackgroundDrawable(friendContext.getResources().getDrawable(R.drawable.background)); R.drawable.background这个只能访问本程序中的资源,修改成其它进程的资源名语法上是错误的。 C#的加密算法,求翻译 popupwindow的问题 计数器显示 新手求教,如何获得手机的位置? 关于seekbar和textview结合 急急急!! 手机浏览器 startActivity时出错 求助:android 2.1 修改系统配置参数时出现异常 如何清除handler消息 百度定位多次定位出现崩溃,这种情况出现在个别机型 Android SDK 被“和谐”了 获得android 的多媒体硬件加速功能
可以实现apk间数据共享
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就可以直接打开数据库
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; } } }); }}
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:
试了一下,可是可以!但太死了,要访问B的资源,A中必须有一个同名的资源。要不然下面的访问非法。showBg.setBackgroundDrawable(friendContext.getResources().getDrawable(R.drawable.background));
R.drawable.background这个只能访问本程序中的资源,修改成其它进程的资源名语法上是错误的。