Andriod5.0多用户 双开应用

android多用户是5.0之后有的,类似windows的账户系统

不过官方还没有完全确认,API大都是hide状态

我这里提供一种方式并不适用所有的,由于我们有定制化手机,所以有定制化的服务可以开发,所以只需要将源码平台化编译一把,将所需要的类抽取出来,打成jar,再通过AIDL方式暴露出相应的接口,当然这个服务也是系统服务。我们再去开发只需要调用相应AIDL提供相应的接口即可。

下面来详细的说明:

1.首先系统服务

android:sharedUserId="android.uid.system"

签名的时候需要平台对应的签名文件需要signapk.jar签名之后生成apk安装即可

2.将需要的类打成jar(5.0以上版本编译后的class)

在out/target/common/obj/Java_Libraries/framework_intermediates..找到相应的对应的class

源文件

package android.os;

import android.os.Bundle;
import android.content.pm.UserInfo;
import android.content.RestrictionEntry;
import android.graphics.Bitmap; /**
* {@hide}
*/
interface IUserManager {
UserInfo createUser(in String name, int flags);
UserInfo createProfileForUser(in String name, int flags, int userHandle);
void setUserEnabled(int userHandle);
boolean removeUser(int userHandle);
void setUserName(int userHandle, String name);
void setUserIcon(int userHandle, in Bitmap icon);
Bitmap getUserIcon(int userHandle);
List<UserInfo> getUsers(boolean excludeDying);
List<UserInfo> getProfiles(int userHandle, boolean enabledOnly);
UserInfo getProfileParent(int userHandle);
UserInfo getUserInfo(int userHandle);
boolean isRestricted();
int getUserSerialNumber(int userHandle);
int getUserHandle(int userSerialNumber);
Bundle getUserRestrictions(int userHandle);
boolean hasUserRestriction(in String restrictionKey, int userHandle);
void setUserRestrictions(in Bundle restrictions, int userHandle);
void setApplicationRestrictions(in String packageName, in Bundle restrictions,
int userHandle);
Bundle getApplicationRestrictions(in String packageName);
Bundle getApplicationRestrictionsForUser(in String packageName, int userHandle);
boolean setRestrictionsChallenge(in String newPin);
int checkRestrictionsChallenge(in String pin);
boolean hasRestrictionsChallenge();
void removeRestrictions();
void setDefaultGuestRestrictions(in Bundle restrictions);
Bundle getDefaultGuestRestrictions();
boolean markGuestForDeletion(int userHandle);
}

3.写好相应的方法调用:

 /**
* 得到 IUserManager
* @return IUserManager
*/
private IUserManager getIUserManager(){
IUserManager iUserManager = null;
IBinder binder = null;
try {
if(iUserManager==null){
Class<?> ServiceManagerClass = Class.forName("android.os.ServiceManager");
Method method = ServiceManagerClass.getMethod("getService", String.class);
if(binder==null){
binder = (IBinder) method.invoke(ServiceManagerClass, Context.USER_SERVICE);
}
iUserManager = IUserManager.Stub.asInterface(binder);
return iUserManager;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public UserInfo createUser(String name, int flags){
UserInfo info = null;
IUserManager iUserManager = getIUserManager();
if(info == null){
try {
info = iUserManager.createUser(name, flags);
loguser(iUserManager);
return info;
} catch (RemoteException e) {
e.printStackTrace();
}
}
return null;
}
   public UserInfo getUserInfo(int userHandle){
UserInfo info = null;
IUserManager iUserManager = getIUserManager();
if(info == null){
try {
info = iUserManager.getUserInfo(userHandle);
loguser(iUserManager);
return info;
} catch (RemoteException e) {
e.printStackTrace();
}
}
return null;
}
 public boolean removeUser(int userHandle){
IUserManager iUserManager = getIUserManager();
boolean isremove = false;
try {
isremove = iUserManager.removeUser(userHandle);
loguser(iUserManager);
return isremove;
} catch (RemoteException e) {
e.printStackTrace();
}
return false;
}

4写一个AIDL我这里是通过回调方式写的,不熟悉的同学可以回去看看AIDL

   case SERVICE_EXTENDED_API_CREATE_USER_MODE:{
//TODO
if(para!=null){
String name = para.getString(KEY_USER_NAME);
int flags = para.getInt(KEY_USER_FLAG);
UserInfo info = muserPolicy.createUser(name, flags);
if(info!=null){
if (cb != null) {
Bundle data = new Bundle(1);
data.putParcelable(KEY_USER_INFO, info);
try {
cb.onResultOfCallExtendedApi(SERVICE_EXTENDED_API_CREATE_USER_MODE, data);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
}
return 0;
}
  case SERVICE_EXTENDED_API_GET_USER_INFO:{
if(para!=null){
int userHandle = para.getInt(KEY_USER_HANDLER);
UserInfo info = muserPolicy.getUserInfo(userHandle);
if(info !=null){
if (cb != null) {
Bundle data = new Bundle(1);
data.putParcelable(KEY_USER_INFO, info);
try {
cb.onResultOfCallExtendedApi(SERVICE_EXTENDED_API_GET_USER_INFO, data);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
}
return 0;
}
  case SERVICE_EXTENDED_API_REMOVE_USER:{
if(para!=null){
int userHandle = para.getInt(KEY_USER_HANDLER);
boolean isremove = muserPolicy.removeUser(userHandle);
if (cb != null) {
Bundle data = new Bundle(1);
data.putBoolean(KEY_USER_IS_REMOVE, isremove);
try {
cb.onResultOfCallExtendedApi(SERVICE_EXTENDED_API_REMOVE_USER, data);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
return 0;
}

5.再在需要的应用上调用服务端相应的接口:

启动的时候需要bind系统服务

    private void init(){
Intent intent1 = new Intent();
intent1.setPackage("com.xxx.xxx");
intent1.setAction("com.xxx.xxxService");
bindService(intent1, conn1, Context.BIND_AUTO_CREATE);
} case R.id.btn_create:
Bundle create = new Bundle();
create.putString("username", "Zeng");
try {
if(ips!=null){
ips.callExtendedApi(22, create, ipsc);
}else{
Log.e("peng","onclickcreate serviceisnull");
} } catch (RemoteException e) {
e.printStackTrace();
}
break;
case R.id.btn_get:
Bundle get = new Bundle();
get.putInt("userHandle", mhandle);
try {
if(ips!=null){
ips.callExtendedApi(23, get, ipsc);
}else{
Log.e("peng","onclickget serviceisnull");
} } catch (RemoteException e) {
e.printStackTrace();
}
break;
case R.id.btn_remove:
int i = Integer.parseInt(et_text.getText().toString().trim());
Bundle remove = new Bundle();
remove.putInt("userHandle", i);
try {
if(ips!=null){
ips.callExtendedApi(24, remove, ipsc);
}else{
Log.e("peng","onclickremove serviceisnull");
} } catch (RemoteException e) {
e.printStackTrace();
}
break;

对应的callback可以返回对应的数据。

android 5.0 创建多用户 双开多开应用(1)的更多相关文章

  1. android 5.0 创建多用户 双开多开应用(2)

    上一讲 讲了如何创建一个user android 5.0 创建多用户 双开多开应用(1) 为什么要创建User  例如window 系统创建了一个user 会在当前用户下进行操作,而android 多 ...

  2. cocos2d-x 3.0 创建项目

    cocos2d-x 3.0 创建项目  点击打开链接

  3. 教你如何在Android 6.0上创建系统悬浮窗

    郭霖大神的文章:http://mp.weixin.qq.com/s?__biz=MzA5MzI3NjE2MA==&mid=2650235949&idx=1&sn=0f7eded ...

  4. 【Android Studio安装部署系列】三十五、从Android studio3.0.1升级到Android studio3.1.4【以及创建android p模拟器的尝试(未成功)】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 因为想要使用Android P模拟器,所以需要将Android Studio升级到3.1版本以上. Android P模拟器的最低版 ...

  5. 《Thinking in Android 9.0 系统开发源码钻研录》

    最近打算把个人站点的博客文章同步到"博客园"! Thinking in Android -- "系统启动" [启动阶段] [相关文章] 状态 源码版本 init ...

  6. Android 4.0开发之GridLayOut布局实践

    在上一篇教程中http://blog.csdn.net/dawanganban/article/details/9952379,我们初步学习了解了GridLayout的布局基本知识,通过学习知道,Gr ...

  7. Android 4.0源码目录结构

    转:http://blog.csdn.net/xiangjai/article/details/9012387 在学习Android的过程中,学习写应用还好,一开始不用管太多代码,直接调用函数就可以了 ...

  8. Android 5.0 新特性

    Material Design Material Design简介 Material Design是谷歌新的设计语言,谷歌希望寄由此来统一各种平台上的用户体验,Material Design的特点是干 ...

  9. Android 7.0(牛轧糖)新特性

    Android 7.0(牛轧糖)新特性 谷歌正式在I/O大会现场详细介绍了有关Android 7.0的大量信息.目前,我们已经知道,新一代Android操作系统将支持无缝升级,能够通过Vulkan A ...

随机推荐

  1. Android用户界面UI组件--AdapterView及其子类(三) ExpandableListView

    ExpandableListView: List中的每一项可以展开收缩. 一种伸缩式的ListView. android:cacheColorHint="#00000000" 这个 ...

  2. STL unordered_set

    http://www.cplusplus.com/reference/unordered_set/unordered_set/ template < class Key, // unordere ...

  3. VS2010中 为图片添加背景图片

    很简单的东西,嘿嘿 void CTestDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage( ...

  4. Vijos_1218_数字游戏_(划分型动态规划+环状动态规划)

    描述 https://vijos.org/p/1218 给出n个数围成一个环,将其划分成k个部分,每个部分求和再对10取模,最后将每个部分的值相乘,求其最大值与最小值. 描述 丁丁最近沉迷于一个数字游 ...

  5. 读完了简明Python教程(a bite of Python)

    因为学过C/C++,简明教程里很多共通的地方一看就明白. 明天做书最后的练习. <--! 代码占位 -->

  6. 通过 Azure Media Encoder 降低编码成本

    John Deutscher  Azure 媒体服务首席项目经理 正如在我们的定价页面上宣布的那样,我们引入了一种只根据输出千兆字节数收取编码费用的全新定价模型.之前的/传统模型是根据输入和输出千兆字 ...

  7. CSS中背景图片定位方法

    转自:http://www.ruanyifeng.com/blog/2008/05/css_background_image_positioning.html 作者: 阮一峰 日期: 2008年5月 ...

  8. Tomcat7.0配置

    Tomcat7.0下载地址:http://tomcat.apache.org/download-70.cgi 选择符合自己操作系统的版本即可(本机win8-64位系统),选择如下: http://11 ...

  9. 【好文转载c++】 sizeof 使用的经典总结

    为了在人面前畅快的吹牛逼,你必须学会背后努力  -----张小二. 写在转载之前: sizeof到底是多少?本来我没有关注,只是有次室友问了我几个sizeof的问题,我被问住了,他当时问我了sizeo ...

  10. vim spf13

    效果图来一个: http://vim.spf13.com/ 这个网站里面的vim配置非常全,推荐. 下面是对这个vim快捷键总结: <Leader> 是"," 打卡一个 ...