文章目录

  • 一、 账号添加
  • 二、 代码示例
    • 1、 账号添加工具类
    • 2、 权限注册
    • 3、 在 Activity 中调用上述工具类
    • 4、 运行效果
  • 三、 源码资源

一、 账号添加


在上一篇博客 【Android 进程保活】应用进程拉活 ( 账户同步拉活 | 账号服务注册 | 源码资源 ) 介绍了应用账号服务注册 ;

本博客中进行账号添加 ;

账号添加时 , 首先要获取 AccountManager , 通过如下代码获取 :

(AccountManager) context.getSystemService(Context.ACCOUNT_SERVICE)

查询应用的账户类型中 , 是否有该账户 , 调用 accountManager.getAccounts() 方法获取指定账户类型的账户 ,

        // 需要使用 android.permission.GET_ACCOUNTS 权限Account[] accounts = accountManager.getAccounts();

这里的账户类型在 account-authenticator 标签中的 android:accountType 属性中定义的 , 如下示例 :

<account-authenticatorxmlns:android="http://schemas.android.com/apk/res/android"android:accountType="keep_progress_alive.account"android:icon="@mipmap/ic_launcher"android:label="@string/app_name" />

调用 AccountManager 的 getAccounts() 函数 , 需要用到 android.permission.GET_ACCOUNTS 权限 , 在 AndroidManifest.xml 中声明该权限 ;

<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="kim.hsl.keep_progress_alive"><uses-permissionandroid:name="android.permission.GET_ACCOUNTS"android:maxSdkVersion="22" /><application />
</manifest>

如果获取的账户数组不为空 , 说明账户已经存在 , 这里不再进行处理 ;

如果获取的账户数组为空 , 说明账户还没有添加 , 这里需要创建并添加账户 ;

创建账户 : 需要传入账户名称 , 以及账户类型 ;

            //创建账户Account account = new Account("kim.hsl", ACCOUNT_TYPE);

添加账户 : 需要设置创建的账户 , 账户对应密码 , 账户数据 , 这里设置为空 ;

            // 添加一个新账户accountManager.addAccountExplicitly(account, "123456", new Bundle());

调用 AccountManager.addAccountExplicitly 需要使用 android.permission.AUTHENTICATE_ACCOUNTS 权限 , 需要在 AndroidManifest.xml 中声明账户 ;

<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="kim.hsl.keep_progress_alive"><uses-permissionandroid:name="android.permission.GET_ACCOUNTS"android:maxSdkVersion="22" /><uses-permissionandroid:name="android.permission.AUTHENTICATE_ACCOUNTS"android:maxSdkVersion="22" /><application />
</manifest>

二、 代码示例


1、 账号添加工具类

账号添加工具类 :

package kim.hsl.keep_progress_alive.account_service;import android.accounts.Account;
import android.accounts.AccountManager;
import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Bundle;public class AccountUtils {/*** 添加账户类型* 在 account-authenticator xml 标签中的 android:accountType 属性中定义的*/public static final String ACCOUNT_TYPE = "keep_progress_alive.account";/*** 添加账户* @param context*/public static void addAccount (Context context){AccountManager accountManager = (AccountManager) context.getSystemService(Context.ACCOUNT_SERVICE);// 需要使用 android.permission.GET_ACCOUNTS 权限Account[] accounts = accountManager.getAccounts();// 该类型账号不为空if (accounts.length > 0){// 账户已存在 , 不进行处理}else{//创建账户Account account = new Account("kim.hsl", ACCOUNT_TYPE);// 添加一个新账户accountManager.addAccountExplicitly(account, "123456", new Bundle());}}}

2、 权限注册

需要注册如下两个权限 :

    <uses-permissionandroid:name="android.permission.GET_ACCOUNTS"android:maxSdkVersion="22" /><uses-permissionandroid:name="android.permission.AUTHENTICATE_ACCOUNTS"android:maxSdkVersion="22" />

完整清单文件示例 :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="kim.hsl.keep_progress_alive"><uses-permission android:name="android.permission.FOREGROUND_SERVICE" /><uses-permissionandroid:name="android.permission.GET_ACCOUNTS"android:maxSdkVersion="22" /><uses-permissionandroid:name="android.permission.AUTHENTICATE_ACCOUNTS"android:maxSdkVersion="22" /><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.Keep_Progress_Alive"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><!--设置最近任务列表中不显示该 Activity 组件 ( 不要被用户察觉 )android:excludeFromRecents="true"设置 Activity 亲和性让该界面在一个独立的任务栈中 , 不要与本应用的其它任务栈放在一起避免解除锁屏后 , 关闭 1 像素界面 , 将整个任务栈都唤醒android:taskAffinity="kim.hsl.keep_progress_alive.alive"--><activityandroid:name=".one_pixel_activity.OnePixelActivity"android:excludeFromRecents="true"android:taskAffinity="kim.hsl.keep_progress_alive.onepixel"android:theme="@style/OnePixelActivityTheme" /><!-- 用于提权的前台进程 --><serviceandroid:name=".foreground_service.ForegroundService"android:enabled="true"android:exported="true" /><!-- 用于提权的前台进程, 关闭通知操作 --><serviceandroid:name=".foreground_service.CancelNotificationService"android:enabled="true"android:exported="true" /><!-- 系统 Service 机制拉活 --><serviceandroid:name=".stick_service.StickService"android:enabled="true"android:exported="true" /><!-- 用于账户同步拉活 --><serviceandroid:name=".account_service.AuthenticationService"android:enabled="true"android:exported="true" ><intent-filter><action android:name="android.accounts.AccountAuthenticator"/></intent-filter><meta-dataandroid:name="android.accounts.AccountAuthenticator"android:resource="@xml/account_authenticator"/></service></application></manifest>

3、 在 Activity 中调用上述工具类

package kim.hsl.keep_progress_alive;import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.os.Bundle;import kim.hsl.keep_progress_alive.account_service.AccountUtils;
import kim.hsl.keep_progress_alive.foreground_service.ForegroundService;
import kim.hsl.keep_progress_alive.one_pixel_activity.KeepProgressAliveManager;
import kim.hsl.keep_progress_alive.stick_service.StickService;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 1.  1 像素 Activity 提升应用权限// 注册广播接收者 , 1 像素 Activity 启动的 广播接收者//KeepProgressAliveManager.getmInstance().registerReceiver(this);// 2. 通过前台 Service 提升应用权限// 启动普通 Service , 但是在该 Service 的 onCreate 方法中执行了 startForeground// 变成了前台 Service 服务//startService(new Intent(this, ForegroundService.class));// 3. 使用 Service 机制拉活//startService(new Intent(this, StickService.class));// 4. 账户同步拉活AccountUtils.addAccount(this);}@Overrideprotected void onDestroy() {super.onDestroy();// 1. 取消注册广播接收者, 也可以不取消注册//KeepProgressAliveManager.getmInstance().registerReceiver(this);}
}

4、 运行效果

程序运行后 , 可以在 " 设置 -> 账号 " 中查看该账号信息 ;

点击去后的内容 :

三、 源码资源


源码资源 :

  • GitHub 地址 : https://github.com/han1202012/Keep_Progress_Alive
  • CSDN 源码快照 : https://download.csdn.net/download/han1202012/16604058

【Android 进程保活】应用进程拉活 ( 账户同步拉活 | 账号添加 | 源码资源 )相关推荐

  1. Android进程保活的一般套路

    自己曾经也在这个问题上伤过脑经,前几日刚好有一个北京的哥们在QQ说在做IM类的项目,问我进程保活如何处理比较恰当,决定去总结一下,网上搜索一下进程常驻的方案好多好多,但是很多的方案都是不靠谱的或者不是 ...

  2. Android进程保活方案

    自己曾经也在这个问题上伤过脑经,前几日刚好有一个北京的哥们在QQ说在做IM类的项目,问我进程保活如何处理比较恰当,决定去总结一下,网上搜索一下进程常驻的方案好多好多,但是很多的方案都是不靠谱的或者不是 ...

  3. Android进程保活方案的几种方案

    自己曾经也在这个问题上伤过脑经,前几日刚好有一个北京的哥们在QQ说在做IM类的项目,问我进程保活如何处理比较恰当,决定去总结一下,网上搜索一下进程常驻的方案好多好多,但是很多的方案都是不靠谱的或者不是 ...

  4. 【Android 进程保活】应用进程拉活 ( 双进程守护保活 )

    文章目录 一. 双进程守护保活原理 二. 双进程守护保活完整源码 1.AIDL 接口 2.本地前台服务 Service 3.远程前台服务 Service 4.清单配置 5.启动两个服务 5.执行效果 ...

  5. 【Android 进程保活】应用进程拉活 ( 双进程守护 + JobScheduler 保活 | 成功率最高 | 推荐使用 )

    文章目录 一. 双进程守护保活 + JobScheduler 原理 二. 双进程守护保活 + JobScheduler 源码 1.JobService 代码 2.判定服务运行工具类 3.清单文件 4. ...

  6. 【Android 进程保活】应用进程拉活 ( JobScheduler 拉活 | JobScheduler 使用流程 | JobService 服务 | 不同版本兼容 | 源码资源 )

    文章目录 一. JobScheduler 用法简介 二. JobScheduler 拉活完整代码 1. JobService 2.清单文件 3.启动 JobScheduler 任务 4.运行效果 三. ...

  7. 【Android 进程保活】应用进程拉活 ( 系统 Service 机制拉活 | Service 组件 onStartCommand 方法分析 | 源码资源 )

    文章目录 一. Service 组件 onStartCommand 方法分析 1. onStartCommand 函数返回值分析 2. onStartCommand 函数 START_STICKY_C ...

  8. Android进程保活、拉活方案

    引言 最近产品提出了一个非常BT的需求,说我们所做的APP要做到像微信和QQ那种即时用户清理了进程还是能收到消息的效果,当时心中就卧槽了一顿,虽然心里一万只曹尼玛翻滚着,但是功能还是要做啊,因为生活还 ...

  9. Android进程保活拉活

    参考:腾讯视频相关视频公开课 学习资料: 探讨Android6.0及以上系统APP常驻内存(保活)实现-争宠篇 目录 一.进程的一些基本常识 二.如何保活 三.如何拉活 四.总结 一.进程的一些基本常 ...

最新文章

  1. JVM结构、内存分配、垃圾回收算法、垃圾收集器。
  2. 静态路由与配置 知识点
  3. pytorch教程龙曲良11-15
  4. zblog php 标题优化,Zblog分类页标题重复的优化 - 张力博客
  5. 正月初六 | 2月17日 星期二 | 快手体育拿下斯诺克赛事版权;华为推出“智慧养猪”方案;春节档总票房突破60亿元...
  6. 一切事物皆对象_基础篇
  7. 百度地图label样式修正
  8. leetcode-22-括号生成
  9. 自定义rest api的基本思想过程--总结
  10. 深圳立仪发布纳米级高分辨率光谱共焦位移传感器,精度再破纪录
  11. 计算机专业正高职称怎么获得,正高级软件工程师职称认定办理
  12. Backtrader量化回测8——手续费
  13. Xilinx FPGA等效门数计算
  14. 元宇宙、区块链和潘家园
  15. 时序动作定位 | I3D(Inflated 3D ConvNet) 与 UNT(UntrimmedNets) 特征模型
  16. 计算机英语输入法怎么,电脑英文输入法不见了怎么处理?
  17. 自动柜员机是不是微型计算机,微型计算机基础知识.pptx
  18. 天池o2o优惠券使用预测(入门)
  19. python 全自动化爬取必应图片
  20. c4d用python能做出啥动画_C4D治愈系动画,到底如何实现?

热门文章

  1. python开发_python中的range()函数
  2. 开启文件高级共享功能
  3. 无法删除xxx文档/文件夹:找不到指定的路径。请确定指定的路径是否正确
  4. P1642 规划 01分数规划+树形DP
  5. synchronized关键字原理
  6. python 使用UUID库生成唯一ID
  7. 解决Win8下使用net use命令磁盘映射无效的问题
  8. Java Daemon线程
  9. 一步步构建多层架构系列二之设计模式运用篇
  10. 脚本调用后台代码 asp.net ajax