初学Android ShareUserId(多应用共享资源和服务)

Android里面每个app都有一个唯一的linux user ID。我们通过SharedUserId,让使用相同的userID的两个app应用可以看到对方的文件。为了节省资源,具有相同ID的apk也可以在相同的linux进程中进行。ShareUserId的作用:数据共享、调用其他程序资源。

步骤:

一、新建a,b两个android项目,a  的包名com.rainwii.client     b  的包名com.rainwii.service

二、在a、b项目向的manifest.xml增加相同的android:sharedUserId="com.rainwii.share"。

a manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.rainwii.client"
    android:versionCode="1"
    android:versionName="1.0"
    android:sharedUserId="com.rainwii.share" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.rainwii.client.MainActivity"
            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>

</manifest>

b manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.rainwii.service"
    android:versionCode="1"
    android:versionName="1.0"
    android:sharedUserId="com.rainwii.share">

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.rainwii.service.MainActivity"
            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>

</manifest>

三、在MainActivity.class中利用contextcreatePackageContext获取另外一个程序的Context。

a的MainActivity.class

package com.rainwii.client;

import com.rainwii.main.R;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager.NameNotFoundException;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {
Button startappbutton;
String str;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        try {
            Context ct=this.createPackageContext ("com.rainwii.service", Context.CONTEXT_IGNORE_SECURITY);
           str = ct.getString(R.string.app_name);

        } catch (NameNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        startappbutton= (Button) findViewById(R.id.button1);
        startappbutton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Toast.makeText(MainActivity.this, ""+str, Toast.LENGTH_SHORT).show();
            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

b的MainActivity.class

package com.rainwii.service;

import com.rainwii.main.R;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager.NameNotFoundException;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {
Button startappbutton;
String str;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        try {
            Context ct=this.createPackageContext ("com.rainwii.client", Context.CONTEXT_IGNORE_SECURITY);
           str = ct.getString(R.string.app_name);

        } catch (NameNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        startappbutton= (Button) findViewById(R.id.button1);
        startappbutton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Toast.makeText(MainActivity.this, ""+str, Toast.LENGTH_SHORT).show();
            }
        });
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

注释:Context有个createPackageContext(packageName,flags)方法,可以创建另外一个包的上下文,这个实例不同于它本身的Context实例,但是功能是一样的。这个方法有两个参数:  1、packageName 包名,要得到Context的包名

    2、flags 标志位,有CONTEXT_INCLUDE_CODE和CONTEXT_IGNORE_SECURITY两个选项。CONTEXT_INCLUDE_CODE的意思是包括代码,也就是说可以执行这个包里面的代码。CONTEXT_IGNORE_SECURITY的意思 是忽略安全警告,如果不加这个标志的话,有些功能是用不了的,会出现安全警告。

时间: 2025-01-20 06:37:44

初学Android ShareUserId(多应用共享资源和服务)的相关文章

Android应用程序UI硬件加速渲染的预加载资源地图集服务(Asset Atlas Service)分析

我们知道,Android系统在启动的时候,会对一些系统资源进行预加载.这样不仅使得应用程序在需要时可以快速地访问这些资源,还使得这些资源能够在不同应用程序之间进行共享.在硬件加速渲染环境中,这些预加载资源还有进一步优化的空间.Android系统提供了一个地图集服务,负责将预加载资源合成为一个纹理上传到GPU去,并且能够在所有的应用程序之间进行共享.本文就详细分析这个预加载资源地图集服务的实现原理. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! 资源预加载

[转]Android与电脑局域网共享之:Samba Server

大家都有这样的经历,通过我的电脑或网上邻居访问另一台计算机上的共享资源,虽然电脑和手机之间可以有多种数据传输方式,但通过Windows SMB方式进行共享估计使用的人并不是太多,下面我就简单介绍一下,如何在Android上建立一个与计算机相同的共享方式,在Linux中,我们称之为Samba,使用的是与Windows 系统相同的SMB/CIFS协议,一旦建立好,我们就可以在计算机中象访问其它计算机的共享资源一样访问手机中的资源了. 首页,必须有对应的软件,这个软件的名称叫做"Samba FileS

[转]Android与电脑局域网共享之:Samba Client

在上一篇文章中我提到如何在Android手机上建立Windows共享服务器,现在来说说一个反向的问题,就是,如何在Android手机上访问Windows计算机中的共享资源,当然,前提也是需要软件,这里和大家分享的软件名称叫:AndSMB,它是一款免费的应用,你可以在这里下载得到: Samba Client 下载地址 Google Play官方商店:https://play.google.com/store/apps/details?id=lysesoft.andsmb Google Play手机

Android SDK 在线更新镜像服务器资源

Android SDK 在线更新镜像服务器资源: 大连东软信息学院镜像服务器地址: http://mirrors.neusoft.edu.cn 端口:80 北京化工大学镜像服务器地址: IPv4: http://ubuntu.buct.edu.cn/ 端口:80 IPv4: http://ubuntu.buct.cn/ 端口:80 IPv6: http://ubuntu.buct6.edu.cn/ 端口:80 上海GDG镜像服务器地址: http://sdk.gdgshanghai.com 端口

【JAVA并发】共享资源访问

什么是共享资源 先了解下JAVA程序在运行时内存的分布,由以下部分组成 堆:所有线程共享一个堆:存放的都是new 出来的对象: 方法区:所有线程共享一个方法区:里面存放的内容有点杂,可以认为是除堆和栈中的其它东西(如类信息,静态变量,常量,代码等): 程序计数器:也叫PC,存放下一条指令所在单元的地址的地方; JAVA栈:每个线程都有一个自己的JAVA栈;存放的一般是方法的局部变量,方法出口信息等: 本地方法栈:与JAVA栈类似,区别是使用的对象不一样,本地方法栈是给Native方法使用的,JA

共享资源加锁的操作方法-10-多线程

1 在多线程的编程环境中,锁的使用必不可少! 2 于是,今天来总结一下为共享资源加锁的操作方法. 3 4 一.使用synchronized方式 5 6 //线程1 7 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 8 @synchronized(_myLockObj){ 9 [obj1 method1]; 10 sleep(30); 11 } 12 @synchronized(ob

Java多线程、主线程等待所有子线程执行完毕、共享资源

1.Java创建与启动线程 Java提供两种方式创建和启动线程:1.直接Thread类,2.实现Runable接口. 1.1  继承Thread类 public class myThread extends Thread { public void run(){ for(int i=0;i<5;i++){ System.out.println(this.getName()+":"+i); } } public static void main(String[] args){ //

基于LAMP平台利用NFS远程共享资源实现站点构建

要求: 构建NFS共享服务,利用nfs来提供远程共享资源,web服务通过远程共享资源来构建一个基于LAMP环境的站点(WordPress),要求此站点可以正常发布文章和图片) 环境: 192.168.1.101----->Web 192.168.1.110----->Mariadb 192.168.1.113----->PHP 192.168.1.114----->NFS 一.部署LAMP环境 #web服务的部署(192.168.1.101) (1)安装服务:yum -y inst

【java项目实战】ThreadLocal封装Connection,实现同一线程共享资源

线程安全一直是程序员们关注的焦点.多线程也一直是比較让人头疼的话题,想必大家以前也遇到过各种各种的问题.我就不再累述了.当然,解决方案也有非常多,这篇博文给大家提供一种非常好的解决线程安全问题的思路. 首先.我们先简单的认识一下ThreadLocal,之后是实例+解析,最后一句话总结. 1.认识一下ThreaLocal 认识ThreadLocal必需要通过api文档,不只具有说服力,并且它会给你更加全面的解释.以下我我给大家从api文档上截取一张图,并标出来了七点需要重点理解的内容,实例过后的解