日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

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

發布時間:2023/12/3 Android 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android中暂停服务,Android 装逼技术之暗码启动应用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

喜歡的小伙伴歡迎關注,我會定期分享Android知識點及解析,還會不斷更新的BATJ面試專題,歡迎大家前來探討交流,如有好的文章也歡迎投稿。

什么是暗碼?

在撥號盤中輸入*#*##*#*后,APP 可以監控到這些輸入,然后做相應的動作,比如啟動應用,是不是有點騷。

下面看下這個騷操作是如何實現的。

效果預覽

源碼

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,收功。

覺得文章不錯的小伙伴幫忙點點贊加關注哦 ,有什么問題的話也歡迎大家前來探討交流。

總結

以上是生活随笔為你收集整理的android中暂停服务,Android 装逼技术之暗码启动应用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。