NotKillNotification 確認と実装検討

ええと、以下から落としたソレがようやく動きまして (動かなかったのは端末マター)

なんとなく中身を確認し始めている次第です。今日もどこかに移動したいな、と思いつつ、面倒なのでおそらくこのまま、だろうと思います。昨日は移動したら色々と痒い所に手が届かないところがあったりなんかして、このままでは引き篭りに拍車が (ry
とりあえずざっくり確認、ということなんですが順に以下。

  • Activity から onStart で startService されている
  • Activity のボタン click からは Notification の表示/非表示
  • 謎のメソドが三つ
    • startForeground
    • stopForeground
    • setForeground
      • これは古い、ってことでスルーで良いかな
      • あ、それで startForegroundCompat、なのか

ええと、今の実装だと Activity 表示、ということになっているのか。

    private IMainService.Stub mMainSerciceIf = new IMainService.Stub() {
        @Override
        public void showNotification() throws RemoteException {
            Notification notification = new Notification(R.drawable.icon, "hoge", System.currentTimeMillis());
            PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(), 0, new Intent(getApplicationContext(), MainActivity.class), Intent.FLAG_ACTIVITY_NEW_TASK);
            notification.setLatestEventInfo(getApplicationContext(), "hoge", "hogehoge", contentIntent);
            startForegroundCompat(R.string.app_name, notification);
        }

通知の詳細押したら on/off 切り替えたいのだったか。表示/非表示な機能も残すはずなのですがこちらは無問題かな。
単純に intent を投げてもらって receiver で受けとって Service 型の属性で on/off を判断すれば良いのか成程。

むむ

理解はできたんですが、盛り込み着手な勇気がなくって浅漬け作ってたのは秘密です。

追記

結構修正が多岐に渡る、というのもアレ。あ、あとサンプルとの差分がアレ。

    void invokeMethod(Method method, Object[] args) {
        try {
            mStartForeground.invoke(this, mStartForegroundArgs);
        } catch (InvocationTargetException e) {

上記、サンプルだと以下になってて

    void invokeMethod(Method method, Object[] args) {
        try {
            method.invoke(this, mStartForegroundArgs);
        } catch (InvocationTargetException e) {

何か不具合でもあったのかな。
そりゃ良いとして、諸々以下にメモを控え。

  • Notification 詳細クリックで Service の起動/停止を行ないたい
    • あら、ACTION_{EXECUTE,STOP} で云々してるんだった
    • ということは getService な PendingIntent で良いのかどうか
    • あ、違うか。receiver から startService って可能なのかなぁ
    • Service の内部でフラグを持っておいて保険にすれば getService なソレでも OK か
  • PreferenceActivity 側での処理
    • 今は Service 起動な設定のみ
    • 通知バーに表示する/しないな設定項目追加か
      • Service に bind しとけば設定可能

うう、なんか整理が全然できてないし。こーゆー時は UI のガワだけ作って考えるのが吉かな。とりあえず Preference なソレなので xml を変更、なのか。もう項目は全部追加してやれ。

  • Set Notification
    • 参考にしてるソレは off したら Service 止めてるな
    • Enabling this will prevent the service being stopped by the system. か
  • Auto Start
    • Auto start after boot completed

このチェック連動な仕組みってどうやんのかな。を、あった。

ええと、元締め側で android:disableDependentsState の指定をして (しなくても良いかも)、子分側で android:dependency で親分の key を指定すれば良いのか。
親分側では android:key な属性の設定が必要と。
で、とりあえず PreferenceScreen な xml は以下なカンジで。

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <CheckBoxPreference
        android:defaultValue="false"
        android:key="@string/pref_key_social_recommendations"
        android:summary="@string/pref_description_social_recommendations"
        android:title="@string/pref_title_social_recommendations"
        />

    <CheckBoxPreference
        android:defaultValue="true"
        android:key="@string/pref_key_show_notification"
        android:summary="@string/pref_description_show_notification"
        android:title="@string/pref_title_show_notification"
        android:dependency="@string/pref_key_social_recommendations"
        />
    
    <CheckBoxPreference
        android:defaultValue="true"
        android:key="@string/pref_key_auto_start"
        android:summary="@string/pref_description_auto_start"
        android:title="@string/pref_title_auto_start"
        android:dependency="@string/pref_key_social_recommendations"
        />
        
</PreferenceScreen>

で、これを元に Service 側のナニを云々すれば良いのか。とりあえずここで commit 作っておいた方が良さげかも。

続き

もすこし時間があるようなので検討再開。ええと、Activity 側から bind しなきゃ、なのか。ええと、とりあえず追加した checkbox の on/off な処理はスルーしよう。
つうか、通知側から startService するのであればちょい微妙かな。
今って Preference からチェックボックスの中身変更なタイミングで ACTION が異なる intent で startService してるんですが、これどうしたもんかな。

  • いっちゃん上の checkbox
    • on で Service 開始
    • off で Service 停止
  • にばんめの checkbox
    • on で通知バーに表示
    • off で通知バー非表示

つーことは、いっちゃん上の check が on になった時、次の checkbox の状態に沿って Service 側に云々しなきゃいけない、ってことなのか。面倒だなぁ。(を
面倒くさいので設定項目は削除して強制で通知バーに出す、ってことにするか。この方向でいくと Activity 側と bind する必要はないですね。超横着。切り替えが不要なのであれば、話は簡単な気がしてきた。
通知からの on/off トリガを処理できるように Activity からのトリガな i/f を変更する必要がありそげ。やはり Service 内部にフラグ持っといて切り替える方が楽ちんなんですが、試験の必要あるカンジ。
ここでちょっと手を止めて晩メシ製造に着手です。

もうちょい備忘まで

もう実装な手が動かないのでメモのみ。

  • あ、Activity から start される時と通知からアレされるナニは分けりゃ良いのか
    • Service の属性としての boolean なソレは保持
    • ACTION_EXECUTE および ACTION_STOP では強制で true/false 代入
    • 通知からナニされた時は逆を入れる

Notification を出す/出さない、を略するとサンプルが無意味になってワケワカになるな。しかもコンパチ無視したらもっと簡単に書けるなとか思ってたりして。
とりあえず明日、通知の試験ができたら凄く進捗する気がしてるんですが手を付けることができるかどうかが鍵 (ぇ