当前位置: 首页 > wzjs >正文

建筑工具网站最佳的资源磁力搜索引擎

建筑工具网站,最佳的资源磁力搜索引擎,佛山新网站建设效果,文字字体是什么网站一、前言 应用双开简单说就是创建一个用户然后将已经存在的APP安装到制定的userId中&#xff0c;下面新建一个系统应用来实现功能。 二、系统APP 首先要调整最大用户数量这个再framework/base/core/res/res/values/config.xml下面 <!-- Maximum number of supported use…

一、前言

应用双开简单说就是创建一个用户然后将已经存在的APP安装到制定的userId中,下面新建一个系统应用来实现功能。

二、系统APP

首先要调整最大用户数量这个再framework/base/core/res/res/values/config.xml下面

    <!--  Maximum number of supported users --><integer name="config_multiuserMaximumUsers">1</integer>

但是LineageOS已经用overlay的方式配置过了,最大是支持4个用户,所以这里不需要调整。直接下一步制作系统应用。

清单文件,权限,以及sharedUserId配置如下

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:sharedUserId="android.uid.system"><uses-permission android:name="android.permission.DELETE_PACKAGES" /><uses-permission android:name="android.permission.MANAGE_USERS"/><uses-permission android:name="android.permission.CREATE_USERS"/><uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL"/><uses-permission android:name="android.permission.INSTALL_EXISTING_PACKAGES"/><uses-permission android:name="android.permission.INSTALL_PACKAGES"/><uses-permission android:name="com.android.permission.INSTALL_EXISTING_PACKAGES" /><applicationandroid:allowBackup="true"android:dataExtractionRules="@xml/data_extraction_rules"android:fullBackupContent="@xml/backup_rules"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.MyApplication"><activityandroid:name="com.example.split.MainActivity"android:exported="true"android:label="@string/app_name"android:theme="@style/Theme.MyApplication"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

MainActivity.kt

package com.example.splitimport android.app.ActivityManager
import android.app.ActivityThread
import android.app.IActivityManager
import android.content.pm.LauncherApps
import android.content.pm.PackageInfo
import android.content.pm.PackageInstaller
import android.content.pm.PackageManager
import android.content.pm.PackageManager.MATCH_ANY_USER
import android.content.pm.UserInfo
import android.os.Build
import android.os.Bundle
import android.os.UserHandle
import android.os.UserManager
import android.util.DisplayMetrics
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.annotation.RequiresApi
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Switch
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.android.internal.R.string.loading
import com.example.split.ui.theme.MyApplicationTheme
import com.example.splite.R
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launchprivate const val targetPackage = "com.example.cloudclient"private const val testUserName = "testUserName"class MainActivity : ComponentActivity() {val metrics = DisplayMetrics()var createUserId:Int=-1@RequiresApi(Build.VERSION_CODES.S)override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)windowManager.defaultDisplay.getMetrics(metrics)enableEdgeToEdge()val launcherApps=LauncherApps(this)setContent {val scope = rememberCoroutineScope()MyApplicationTheme {Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->Box(Modifier.fillMaxSize().padding(innerPadding)){var checked = remember {val userManager=UserManager.get(this@MainActivity)val userInfoList: List<UserInfo> = userManager.userscreateUserId=userInfoList.find {it.name== testUserName}?.id?:-1val packageManager = ActivityThread.getPackageManager();val slices=packageManager.getInstalledPackages(MATCH_ANY_USER.toLong(),createUserId?:-1)val installed=slices.list.find {if(it is PackageInfo){it.packageName==targetPackage}else{false}}!=nullmutableStateOf(installed)}var loading= remember {mutableStateOf(false)}val scope = rememberCoroutineScope()Column {Row (Modifier.fillMaxWidth().padding(20.dp), verticalAlignment = Alignment.CenterVertically){Box(Modifier.weight(1f)){Image(modifier = Modifier.size(50.dp),painter = painterResource(R.mipmap.scrrr),contentDescription = "e")}Switch(checked.value,{if(it){scope.launch (Dispatchers.Default){loading.value=truecreateUser()startBackground(createUserId)installToUserId(createUserId,checked)loading.value=false}}else{scope.launch (Dispatchers.Default){loading.value=trueuninstallToUserId(createUserId,checked)loading.value=false}}})}if(loading.value){CircularProgressIndicator(modifier = Modifier.align(alignment = Alignment.CenterHorizontally).size(60.dp))}}}}}}}@RequiresApi(Build.VERSION_CODES.S)private fun uninstallToUserId(userId: Int, checked: MutableState<Boolean>) {val packageManager = ActivityThread.getPackageManager();try {val packageInstaller =  PackageInstaller(packageManager.packageInstaller,packageName,null,userId)packageInstaller.uninstallExistingPackage(targetPackage,null);checked.value=false}catch ( e:Exception){e.printStackTrace();}}fun createUser(){val userManager=UserManager.get(this)val userInfoList: List<UserInfo> = userManager.usersvar isCreated = falsefor (userInfo in userInfoList) {if (testUserName == userInfo.name) {isCreated = truecreateUserId = userInfo.idbreak}}if (!isCreated) {val userHandle: UserHandle = userManager.createProfile(testUserName,UserManager.USER_TYPE_PROFILE_MANAGED,HashSet<String>())!!createUserId = userHandle.identifier}}fun startBackground(userId:Int){//后台启动userIdval  am: IActivityManager = ActivityManager.getService();try {am.startUserInBackground(userId);} catch ( e:Exception) {e.printStackTrace()}}@RequiresApi(Build.VERSION_CODES.Q)fun installToUserId(userId: Int, checked: MutableState<Boolean>){val packageManager = ActivityThread.getPackageManager();try {val packageInstaller =  PackageInstaller(packageManager.packageInstaller,packageName,null,userId)packageInstaller.installExistingPackage(targetPackage,PackageManager.INSTALL_REASON_USER,null);checked.value=true}catch ( e:Exception){e.printStackTrace();}}
}@Preview(showBackground = true)
@Composable
fun GreetingPreview() {MyApplicationTheme {}
}

步骤还是比较清晰,这里我只对某个已经安装的自己的App做双开:
1.进入双开应用的时候检查是否已经安装到指定用户,如果已经安装就配置UI的switch
2.switch切换的时候安装,总共三步
2.1 创建user并获取userid
2.2 启动user
2.3 将制定包名的app安装到对应的userid
3.切换回来的时候进行卸载应用
在这里插入图片描述

Lineageos的桌面支持两

❯ adb shell ps -A | grep cloud
u13_a236 9858 24619 14622780 122908 SyS_epoll_wait 0 S com.example.cloudclient
u0_a236 10199 24619 14672596 133628 SyS_epoll_wait 0 S com.example.cloudclient
http://www.dtcms.com/wzjs/285324.html

相关文章:

  • php源码网站修改哈尔滨关键词排名工具
  • 被百度收录的网站有哪些关键词seo培训
  • 珠海网站建设尚古道策略集团网站推广
  • 网站 数据库 模板seoul是哪个国家
  • 中国建设银行北京市分行网站关键词优化策略
  • 网站开发 项目接单广州外包网络推广公司
  • 做同城网站最赚钱大兴今日头条新闻
  • 网站线框图怎样做云服务器
  • php网站做cdn日本比分算1:1
  • 邢台谷歌seo北京网站seo技术厂家
  • 用手机怎么申请免费自助网站长沙网
  • 泉州网站建设lben注册推广
  • 专门做网站的公司交什么seo监控
  • wordpress侧边栏浮动广州抖音seo公司
  • 海南哪家公司做网站做的好新闻发稿推广
  • 网站建设需要的文案网络营销推广方式都有哪些
  • 做网站制作赚钱吗英文seo
  • wordpress添加点赞seo优化的优点
  • 个人做网站用什么技术百度关键词排名联系
  • 香河县住房和城乡建设部网站武汉网站关键词推广
  • 怎么登陆建设工程网站seo技术教程博客
  • 搭建网站的流程互联网推广工作好做吗
  • 免费推广手段有哪些潍坊百度快速排名优化
  • 绵阳网站建设策划内容足球世界排名国家
  • 福建网站建建设方案网站安全检测在线
  • 网站搜索引擎优化工具seo模板建站
  • 网站怎么换域名怎么发帖子做推广
  • 网站建设需要版块网站优化助手
  • 网站建设关键要做好哪些百度推广客服投诉电话
  • 好看的页面布局优化的含义是什么