実現したいこと
アプリのインストール時刻から数日後に、バックグラウンドでサービスを起動して通知を出す。
実装
AndroidManifest.xml
xml
1<!-- インストールのBroadcastを取得するreceiver --> 2 <receiver 3 android:name=".receiver.InstallReceiver" 4 android:enabled="true"> 5 <intent-filter> 6 <action android:name="android.intent.action.PACKAGE_ADDED" /> 7 <action android:name="android.intent.action.PACKAGE_FULLY_REMOVED" /> 8 <action android:name="android.intent.action.PACKAGE_REMOVED" /> 9 </intent-filter> 10 </receiver>
動くほうのInstallReceiver.java
java
1public class InstallReceiver extends BroadcastReceiver { 2 @Override 3 public void onReceive(Context context, Intent intent) { 4 if (ntent.ACTION_PACKAGE_ADDED.equals(intent.getAction()) 5 && !intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) { 6 // ここからインストール時間を取得する 7 } 8 }
動かないほうのInstallReceiver.java (NullPointerExceptionを起こす)
java
1public class InstallReceiver extends BroadcastReceiver { 2 @Override 3 public void onReceive(Context context, Intent intent) { 4 if (ntent.ACTION_PACKAGE_ADDED.equals(intent.getAction()) 5 && !intent.getExtras().getBoolean(Intent.EXTRA_REPLACING)) { 6 // ここからインストール時間を取得する 7 } 8 }
動作確認方法
bash
1$ adb shell 2shell@hammerhead:/ $ am broadcast -a android.intent.action.PACKAGE_ADDED 3Broadcasting: Intent { act=android.intent.action.PACKAGE_ADDED } 4Broadcast completed: result=0
参考にした資料
引っかかっている、というか疑問に思っているところ
参考にしている資料ではintent.getExtras()で判定する、とあるがこれを真似するとgetExtras()がnullとなってアプリが落ちる。
しかし、intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)を使うと動く。
ここで気になるのは
- intent.getExtras()がnullになってしまう理由
- intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)を使えば通るが、デフォルト値が返っているだけに思える。インストールと更新の判定が正しく行えているのか不安。
という2点です。
どなたか、Androidにお詳しい方、このモヤモヤを解消してください。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。