android セキュリティ: フラグ FLAG_RECEIVER_REGISTERED_ONLY の意味
原作者に関しては、以下の出典を引用してください。
http://blog.csdn.net/gemmem/article/details/8859493
<スパン 時計ウィジェットを行っている友人は、ACTION_TIME_TICKに精通している必要があります、我々はすべてのUIインターフェイス上の時間を更新するには、この放送を使用しますが、アンドロイドの新しいバージョンが、TIME_TICK放送制限、システムはもはやTIME_TICK放送を受信するAndroidManifest.xmlで受信機の静的な登録を許可しない、プログラマがTIME_TICK放送を聞くために動的登録を使用して強制的に行われます。このような状況に遭遇したとき、皆さんはどのように感じるでしょうか?
<スパン もしかしたら、googleにコードを変更させられて、動的登録はメモリ不足でプロセスが殺されるかもしれないので失敗しがちだと文句を言っていたのかもしれませんね。
<スパン これって、開発者にとっては迷惑な話じゃないですか?
<スパン なぜgoogleは突然TIME_TICKをxmlで登録できなくなったのでしょうか?
TIME_TICKブロードキャストは、alarmManagerServiceから送信されるので、ソースコードを見てみましょう。
AlarmManagerService.java
public AlarmManagerService(Context context) {
mContext = context;
mDescriptor = init();
// We have to set current TimeZone info to kernel
// because kernel doesn't keep this after reboot
String tz = SystemProperties.get(TIMEZONE_PROPERTY);
if (tz ! = null) {
setTimeZone(tz);
}
PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
mTimeTickSender = PendingIntent.getBroadcast(context, 0,
new Intent(Intent.ACTION_TIME_TICK).addFlags(
Intent.FLAG_RECEIVER_REGISTERED_ONLY), 0);
Intent intent = new Intent(Intent.ACTION_DATE_CHANGED);
キーコードは以下の通りです。
mTimeTickSender = PendingIntent.getBroadcast(context, 0,
new Intent(Intent.ACTION_TIME_TICK).addFlags(
Intent.FLAG_RECEIVER_REGISTERED_ONLY), 0);
googleがFLAG_RECEIVER_REGISTERED_ONLYフラグをインテントに追加したため、xml登録でエラーが報告されることが判明したのです。
ACTION_SCREEN_ON/OFFの放送に戻ろう
void com.android.server.PowerManagerService.initInThread()
<スパン
void initInThread() {
......
mScreenOnIntent = new Intent(Intent.ACTION_SCREEN_ON). mScreenOnIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ON);
mScreenOnIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
mScreenOffIntent = new Intent(Intent.ACTION_SCREEN_OFF). mScreenOffIntent.addFlags(Intent;
mScreenOffIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
......
}
もう一つのブロードキャスト、ACTION_BATTERY_CHANGEDを見てみましょう。
バッテリーの残量が変化したときに、このブロードキャストを送信します。
void com.android.server.BatteryService.sendIntent()
private final void sendIntent() {
// Pack up the values and broadcast them to everyone
Intent intent = new Intent(Intent.ACTION_BATTERY_CHANGED);
intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY
| Intent.FLAG_RECEIVER_REPLACE_PENDING);
......
}
ほらね。どれもFLAG_RECEIVER_REGISTERED_ONLYというフラグが付加されていますね。
つまり、これらのシステムブロードキャストはすべて動的にしか登録できないのです。
<スパン <スパン googleはこんなことをやっています。
多くのウイルスプログラムは、終了しても再び実行できるように、いくつかのシステムブロードキャストをxmlに登録し、これらのシステム高頻度ブロードキャストを利用して自己起動を実現しようとしています。
<スパン 例えば、古いバージョンのアンドロイドでは、ウイルスプログラムはTIME_TICKをリッスンすることでバックグラウンドで動作する独自のサービスを起動してこっそり仕事をし、たとえ自分が殺されてもすぐに再起動することができる。
<スパン そして、これらのシステムブロードキャストにフラグが立てられると FLAG_RECEIVER_REGISTERED_ONLYで、これらのウイルスプログラムは運が悪いと言えます。
<スパン <スパン Googleのこの変更により、アンドロイドのセキュリティは確実に向上しました。
関連
-
armeabi-v7a、arm64-v8a、armeabi、x86、x86_64の違いについて
-
ProcessBuilderExceptionCreateProcess error=2, ϵͳÕҲ "μ½ָ¶".
-
アプリの実行エラー。Default ActivityNot Found 完璧な解決策
-
Solve アクティビティのメソッドを実行できませんでした
-
Android携帯で通常のhttpsのサイトにアクセスすると、最初のリクエストで認証パスのトラストアンカーが見つからないと報告され、その後正常にアクセスできるようになり、問題が解決しました。
-
Androidバージョン一覧
-
Android マルチメディア MediaPlayerの使用方法詳細
-
Android ProgressBar解説 ProgressBarの色を変更する
-
appの実行エラー:ターゲットデバイスが見つかりませんでした。
-
ARMアセンブリ共通命令 NULL演算 NOP命令
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
RecyclerView がアダプタが接続されていませんと表示され、レイアウトソリューションをスキップする
-
Rは変数に解決できない
-
Androidです。ViewPagerで現在のインターフェイスのFragmentを取得する
-
Android ListViewでaddHeaderを使用する
-
java.lang.SecurityException を解決してください。android パッケージは 10065 に属していません。
-
android ImageViewの割り当て問題 setImageResourceとsetImageBitmap
-
Android Studioのインポートプロジェクトが表示されます。ファイルをクランチするのに失敗しました
-
Android Studio がエラーを報告します。指定された名前に一致するリソースが見つかりませんでした
-
AndroidManifest.xml ファイルが見つからない 解決方法
-
android studioエミュレータの起動に失敗しました