android中暂停服务,Android 装逼技术之暗码启动应用

前言

喜欢的小伙伴欢迎关注,我会定期分享Android知识点及解析,还会不断更新的BATJ面试专题,欢迎大家前来探讨交流,如有好的文章也欢迎投稿。

什么是暗码?

在拨号盘中输入*#*##*#*后,APP 可以监控到这些输入,然后做相应的动作,比如启动应用,是不是有点骚。

下面看下这个骚操作是如何实现的。

效果预览

8e8485f37eb894b9eaac874853f632ac.gif

源码

DialtactsActivity#showDialpadFragment

DialtactsActivity 中有个 showDialpadFragment 方法,用来加载显示拨号盘,因此入口就从 showDialpadFragment 看起,基于 Android P 分析。private void showDialpadFragment(boolean animate) {

//……

final FragmentTransaction ft = getFragmentManager().beginTransaction();

if (dialpadFragment == null) {

dialpadFragment = new DialpadFragment();

ft.add(R.id.dialtacts_container, dialpadFragment, TAG_DIALPAD_FRAGMENT);

} else {

ft.show(dialpadFragment);

}

//……

}

具体实现在 DialpapFragment 中,看到 DialpapFragment 实现了 TextWatcher,TextWatcher 有 3 个重要方法,分别为:beforeTextChanged,onTextChanged 和 afterTextChanged,重点看 afterTextChanged 方法。

DialpadFragment#afterTextChangedpublic class DialpadFragment extends Fragment

implements View.OnClickListener,

View.OnLongClickListener,

View.OnKeyListener,

AdapterView.OnItemClickListener,

TextWatcher,

PopupMenu.OnMenuItemClickListener,

DialpadKeyButton.OnPressedListener {

//……

@Override

public void afterTextChanged(Editable input) {

// When DTMF dialpad buttons are being pressed, we delay SpecialCharSequenceMgr sequence,

// since some of SpecialCharSequenceMgr's behavior is too abrupt for the "touch-down"

// behavior.

if (!digitsFilledByIntent

&& SpecialCharSequenceMgr.handleChars(getActivity(), input.toString(), digits)) {

// A special sequence was entered, clear the digits

digits.getText().clear();

}

if (isDigitsEmpty()) {

digitsFilledByIntent = false;

digits.setCursorVisible(false);

}

if (dialpadQueryListener != null) {

dialpadQueryListener.onDialpadQueryChanged(digits.getText().toString());

}

updateDeleteButtonEnabledState();

}

//……

}

这里调用了 SpecialCharSequenceMgr 辅助工具类的 handleChars 方法,看这个方法。

SpecialCharSequenceMgr#handleCharspublic static boolean handleChars(Context context, String input, EditText textField) {

// get rid of the separators so that the string gets parsed correctly

String dialString = PhoneNumberUtils.stripSeparators(input);

if (handleDeviceIdDisplay(context, dialString)

|| handleRegulatoryInfoDisplay(context, dialString)

|| handlePinEntry(context, dialString)

|| handleAdnEntry(context, dialString, textField)

|| handleSecretCode(context, dialString)) {

return true;

}

if (MotorolaUtils.handleSpecialCharSequence(context, input)) {

return true;

}

return false;

}

handleChars 方法中,会对各种特殊的 secret code 进行匹配处理,这里我们看 handleSecretCode。

SpecialCharSequenceMgr#handleSecretCodestatic boolean handleSecretCode(Context context, String input) {

// Secret code specific to OEMs should be handled first.

if (TranssionUtils.isTranssionSecretCode(input)) {

TranssionUtils.handleTranssionSecretCode(context, input);

return true;

}

// Secret codes are accessed by dialing *#*##*#* or "*##"

if (input.length() > 8 && input.startsWith("*#*#") && input.endsWith("#*#*")) {

String secretCode = input.substring(4, input.length() - 4);

TelephonyManagerCompat.handleSecretCode(context, secretCode);

return true;

}

return false;

}

再看下 TelephonyManagerCompat.handleSecretCode 方法。

TelephonyManagerCompat#handleSecretCodepublic static void handleSecretCode(Context context, String secretCode) {

// Must use system service on O+ to avoid using broadcasts, which are not allowed on O+.

if (BuildCompat.isAtLeastO()) {

if (!TelecomUtil.isDefaultDialer(context)) {

LogUtil.e(

"TelephonyManagerCompat.handleSecretCode",

"not default dialer, cannot send special code");

return;

}

context.getSystemService(TelephonyManager.class).sendDialerSpecialCode(secretCode);

} else {

// System service call is not supported pre-O, so must use a broadcast for N-.

Intent intent =

new Intent(SECRET_CODE_ACTION, Uri.parse("android_secret_code://" + secretCode));

context.sendBroadcast(intent);

}

}

可以看到在拨号中接收到*#*##*#* 这样的指令时,程序会对外发送广播,这就意味着我们能够接收这个广播然后可以做我们想做的事情。

接下来我们看看这个接受广播代码是怎么写。

应用

首先在 AndroidManifest 文件中注册广播接收器。

android:name=".SecretCodeReceiver">

接收广播,启动应用。public class SecretCodeReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

if (intent != null && SECRET_CODE_ACTION.equals(intent.getAction())){

Intent i = new Intent(Intent.ACTION_MAIN);

i.setClass(context, MainActivity.class);

i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

context.startActivity(i);

}

}

}

这样只要在拨号中输入*#*#1010#*#*就能启动相应的应用程序,OK,收功。

觉得文章不错的小伙伴帮忙点点赞加关注哦 ,有什么问题的话也欢迎大家前来探讨交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333372.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JShell 详解

文章目录一、简介二、为什么使用 JShell三、参考示例启动 JShell退出 JShell声明定义基本类型的变量声明定义一个方法覆盖已存在的变量、方法、类的定义查看 JShell 默认导入的包自动补全功能列出所有键入的源列出已声明方法及其签名加载外部的源代码查看 JShell 提供的所有指令…

graphql_GraphQL在Wildfly群上

graphql“ GraphQL是API的查询语言,是用于使用现有数据完成这些查询的运行时。 GraphQL为您的API中的数据提供了完整且易于理解的描述,使客户能够准确地询问他们所需的内容,仅此而已,使随着时间的推移更容易开发API并启用强大的开…

android中有哪些utils的作用,AndroidUtils

多年开发Android积攒下来好多常用的工具方法,保存在随笔中,持续更新。TimeUtil/*** 获取距当前时刻的时间戳** param createTime* return*/public static String getTimestamp(long createTime) {long currrentMillis System.currentTimeMillis();// if…

Java中的关键字this_super

文章目录要点错误的理解正确的理解演示代码要点 1.在类的构造器中,可以使用 this() 调用本类的其它构造器,调用的时候根据构造器声明的参数列表传递参数值 2.super() 调用父类的无参构造器 3.super.method() 调用父类的 method() 方法 4.super.name …

Spring Hibernate教程

1.简介 在本文中,我们将演示如何利用最流行的ORM(对象关系映射)工具之一的Hibernate的功能 ,该工具可将面向对象的域模型转换为传统的关系数据库。 Hibernate是目前最流行的Java框架之一。 由于这个原因,我们在Java Co…

百度地图瓦片 android,百度地图自定义瓦片图获取

nodejs代码const request require(request);const fs require(fs);const bagpipe require(bagpipe);const TileLnglatTransform require(tile-lnglat-transform);let [x1, y1] [72.26, 54.57]; // 起始点坐标(左上角)let [x2, y2] [137.31, 17.8]; // 终点坐标(右下角)le…

IntelliJ IDEA for Mac 如何自定义快捷键_设置快捷键

文章目录设置代码补全快捷键设置展开全部的快捷键折叠全部快捷键设置代码补全快捷键 代码自动补全,即智能提示。 打开【系统偏好设置】如下图所示: 在左侧的菜单栏中找到 Keymap → Main Menu → Code → Code Completion → Basic: 设…

android8 老手机,华为多款老旧手机获升安卓8.0,流畅度飙升!

原标题:华为多款老旧手机获升安卓8.0,流畅度飙升!一直以来,在手机用户圈都有这么一个共识,那就是安卓手机不如iPhone流畅,之前安卓手机给人的印象就是容易卡顿,而谷歌则一直在为此事苦恼&#x…

java12关键字var_Java 10:“ var”关键字

java12关键字varJava 10使用关键字var引入了局部变量类型推断 。 这意味着无需编写&#xff1a; Map<Department, List<Employee>> map new HashMap<>(); // ... for (Entry<Department, List<Employee>> dept : map.entrySet()) {List<Emp…

IntelliJ IDEA for Mac自定义动态代码模板快捷键(Live Templates Shortcut)

文章目录查看更多的快捷键常用的代码模板自定义代码模板快捷键格式化等号文档注释代码模板快捷键应用示例声明定义引用类型变量数组的 for 循环指定循环次数的 for 循环增强 for 循环倒序 for 循环自动生成普通 for 循环语句自动生成main 方法自动生成输出语句自动生成增强for循…

android udp 设备发现,两台Android设备之间进行UDP连接(使用多播地址)~~求大神指点...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼首先 发送端&#xff1a;package com.example.multicastclient;import android.support.v7.app.ActionBarActivity;import java.io.IOException;import java.net.DatagramPacket;import java.net.InetAddress;import java.net.Mult…

java serial_Java的@Serial批注

java serialJDK可能正在使用JDK 11 &#xff1a; Serial获得另一个标准&#xff08;预定义&#xff09;注释 。 JDK-8202385 [“标记与序列相关的字段和方法的注释”]的目的是添加“某种“ SerialRelated”注释&#xff0c;以促进对序列字段和方法的声明的自动检查。” 这种想法…

IntelliJ IDEA 选中变量名,高亮显示其它地方的这个变量名,高亮颜色如何设置呢?

选中了一个变量名&#xff0c;会高亮显示位于别的地方的这个变量名&#xff0c;那么怎么修改其他地方的高亮颜色&#xff1f; 按下 Command , 打开偏好设置窗口&#xff0c;接着看下图&#xff1a;

rest和rest ful_还有更多REST技巧

rest和rest ful在以前的博客文章中&#xff0c;我介绍了一些实现REST体系结构的想法和技巧。 在这篇文章中&#xff0c;我将介绍更多的想法和技巧。 快取 缓存是原始论文的很大一部分。 见5.1.4节 策略包括验证&#xff08; 客户端检查它是否具有最新版本 &#xff09;和过期…

html实心圆点特殊符号,和平精英名称添加圆点符号的方法 和平精英圆点符号代码分享...

和平精英怎么在名字中添加圆点符号呢&#xff1f;昵称中是可以加入圆点符号的&#xff0c;很多小伙伴们都想要一个性一点的名字&#xff0c;那么就可以用到各种各样的特殊符号&#xff0c;圆点符号复制的代码小编已经分享到下面了&#xff0c;有需要这个圆点符号的玩家快带走吧…

Java包装类和基本数据类型的对照

int --> Integer byte --> Byte short --> Short long --> Long boolean --> Boolean char --> Character double --> Double float --> Float 注&#xff1a;基本类型自动转换成对应的包装类型&#xff0c;叫自动装箱&#xff1b;包装类型转换成对应…

java 8 stream_Java 8 Stream示例

java 8 stream这篇文章将帮助您了解Java 8中一些重要且经常使用的Stream操作&#xff0c;这使您使用Java编程变得容易。 让我们以传统示例为例&#xff0c;“员工和部门”。 public class Employee {private String name;private Integer age;private String city;private De…

html怎么设置图片隐藏,css3如何隐藏图片?

css3隐藏图片的方法&#xff1a;1、为图片元素设置display:none;样式来隐藏。2、使用visibility:hidden;样式隐藏图片。3、使用opacity:0;样式通过设置图片完全透明来设置图片不可见。css中可以使用下面几种样式隐藏图片&#xff1a;display:none;visibility:hidden;opacity:0;…

IntelliJ IDEA修改项目的根目录名称_修改包目录的名称_修改模块名称_修改项目名称

文章目录修改项目根目录的名称修改包目录的名称模块重命名修改了项目根目录后&#xff0c;必须删除项目和 .idea 文件&#xff0c;重新导入&#xff08;重点&#xff09;新版本的 IDEA 取消了 Import Project 入口修改项目根目录的名称 如果仅仅修改项目的名称&#xff0c;而不…

容器rocker_用Rocker制作模板

容器rocker在本文中&#xff0c;我们将快速介绍Rocker &#xff0c;这是一个静态类型化的快速Java 8模板引擎。 必需的依赖项 要开始使用Rocker&#xff0c;我们需要在项目中添加以下依赖项&#xff1a; <dependency><groupId>com.fizzed</groupId><art…