您的位置:首页 > 移动开发 > Android开发

android 应用程序数据共享总结--Moon

2012-06-12 11:37 267 查看

android 应用程序数据共享总结--Moon

1. Share Preference.

2. Content Provider

3. Shared User id
通过Shared User id,拥有同一个User id的多个应用程序可以配置成运行在同一个进程中。所以默认就是可以互相访问任意数据。 也可以配置成运行成不同的进程, 同时可以访问其他应用程序的数据目录下的数据库和文件.就像访问本程序的数据一样.比如某个公司开发了多个Android 程序, 那么可以把数据,图片等资源集中放到应用程序 A中去. 然后这个公司的所有app都使用同一个User ID, 那么所有的资源都可以从APP A中读取。
举个例子:
APP A 和APP B 都是C公司的产品,那么如果用户从APP A中登陆成功.那么打开APP B的时候就不用再次登陆. 具体实现就是 A和B设置成同一个User ID:
* 在2个APPS的AndroidManifest.xml 配置share User ID:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.demo.a1"
android:sharedUserId="com.c">
这个"com.c" 就是share user id, "com.android.demo.a1"是APP A的packagename,而 APP B可是"com.android.demo.b1" 这个没有限制。这个设定好之后, APP B就可以像打开本地数据库那样 打开APP A中的数据库了.APP A把登陆信息存放在A的数据目录下面. APP B每次启动的时候读取APP A下面的数据库。
另外,我们还开在程序中通过得到APP A的上下文之后,才能打开数据库:
APP B中的代码:
mContext = this.createPackageContext("com.android.demo.a1",
Context.CONTEXT_IGNORE_SECURITY);
通过A的package name 就可以得到A的 package context,然后通过这个context就可以直接打开数据库。

4.权限
实现这样的功能:两个应用程序A和B,B要有相应的权限才能访问A中的某个Activity。
首先看A的实现
先在A的Activity里加一个TextView,写些内容方便等下检验。下面设置manifest.xml,增加一个自定义的权限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="giuz.blog1"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name="<u style="outline-style: none; outline-width: initial; outline-color: initial; ">giuz.blog1.ActivityBlog1"
android:label="@string/app_name"
android:permission="<u style="outline-style: none; outline-width: initial; outline-color: initial; ">giuz.permission.SEE">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

<permission android:protectionLevel="normal" android:name="giuz.permission.SEE">
</permission>


</manifest>

下划线部分是要注意的。
第一个下划线,这个Activity的android:name要写包名+类名:giuz.blog1.ActivityBlog1,不然等下会报找不到Activity的错误。
<permission android:protectionLevel="normal" android:name="giuz.permission.SEE"></permission>这句,
android:protectionLevel是必须要的,它的值normal或者dangerous、signature、signatureOrSystem。
android:name的值就是自定义的权限,格式是**.permission.**(giuz.x.permission.SEE也可以的)。

B的实现
B的Activity里通过Intent来访问,在我的代码里,下面的代码是放在一个按钮的点击事件中的:
Intent intent = new Intent();
//下面是用Component实现
//如果我写成intent.setClassName("giuz.blog1", "giuz.blog1.ActivityBlog1")
//却会报错,不理解。
intent.setComponent(new ComponentName("giuz.blog1", "giuz.blog1.ActivityBlog1"));
startActivity(intent)
第二行的第一个参数是A的那个被访问的Activity的包名,第二个参数是包名+类名因为A现在有了自定义的权限,而B现在还没有权限访问,所以如果现在访问会出现 Permission Denial的报错。给B加上权限,就是在B的manifest.xml里加上下面这句<uses-permission android:name="giuz.permission.SEE"></uses-permission>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: