Android 7.1 ( API25 / N_MR1 ) の通知の設定

今や購入時のままの設定のままだと各アプリからの通知が大量に溜まってくる.

Android 7.1 では, 端末側の設定画面が変わっている.

「設定」-「通知」-「右上の歯車マーク」から設定できるのは以下.

- 光を点滅させて通知 (ON/OFF)

- ロック画面の通知 (通知をすべて表示しない/すべての通知内容を表示する)

- Power notification controls (ON/OFF)

画面上部のスピナーからも設定状態別にアプリを抽出表示できる.

- すべてのアプリ
- ブロック中
- マナーモードで表示
- ロック画面にプライベートな内容を表示しない
- ロック画面に表示しない
- [通知を非表示]をオーバーライド

「ブロック中」を選択してみると, いつのまにか Evernote をブロックしていた.

「重要度」というスライダーがあるのだが, 7段階の設定ができる.

- このアプリからの通知を表示しない

- 全画面表示, ポップアップ, 音, バイブレーションを使用しない。通知リストの一番下に表示する。ロック画面やステータスバーには表示しない。

- 全画面表示, ポップアップ, 音, バイブレーションを使用しない。通知リストの一番下に表示する。ロック画面には表示しない。

- 全画面表示, ポップアップ, 音, バイブレーションを使用しない。

- 全画面やポップアップを使用しない。

- 常にポップアップし, 全画面は表示しない。

- 常にポップアップし, 全画面表示も許可する。通知リストの一番上に表示する。

あるいは, 重要度と書いてる下の「A」を押すと, スライダーは利用できなくなり以下となる

- アプリが通知ごとに重要度を識別する。

スライダーの下にはスイッチ.

- [通知を非表示]をオーバーライドする。(ON/OFF)

その下には,「通知音の最少間隔」の設定。

- 無制限
- 10秒
- 30秒
- 1分
...
- 30分

アプリによっては, このアプリごと画面の右上から, アプリ内の設定画面に遷移できる.

と, かなり設定項目多いです. 多すぎません?

まとめ

通知の内容や頻度はアプリを公開している側の考え方に依存していますので, まずは単純にアプリ別に「ブロックする」方法を覚えておくといいのだろうと思います.

「設定」-「通知」で通知してきたアプリを選択.

重要度の下の「A」をタップして, スライダーでこのアプリからの通知をブロック.

これまでの「フィルター」機能 消してしまった通知の確認 はもうできないのか・・・

しかし, 最近のスマホてややこしすぎません? いや, ほんと.

通知が表示されない とかどうせブロックの設定だろ! → 原因「フィルター」

消してしまった不要な通知を2度とこないように「通知履歴」から非表示設定する


RecyclerView のアイテムの中のある部分のクリック

list_mail

まずは, 入れ子なしでばらして書かせたほうがいいような気がするのです.

java - Why doesn't RecyclerView have onItemClickListener()? And how RecyclerView is different from Listview? - Stack Overflow


public static class MyViewHolder extends RecyclerView.ViewHolder {

  public TextView text;
  public ImageView image;
  public OnClickPartsListener listener;

  public MyViewHolder(View itemView, OnClickPartsListener listener) {
    super(itemView);

    this.listener = listener;
    text = (TextView) itemView.findViewById(R.id.text);
    image = (ImageView) itemView.findViewById(R.id.image);

    text.setOnClickListener(new View.OnClickListener {
      listener.onClickText("Text Clicked!!");
    });

    image.setOnClickListener(new View.OnClickListener {
      listener.onClickImage("Image Clicked!!");
    });

  }

  public interface OnClickPartsListener {
    void onClickText(String message);
    void onClickImage(String message);
  }

}


public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {

  private MyViewHolder.OnClickPartsListener listener;

  public MyAdapter(MyViewHolder.OnClickPartsListener listener) {
    this.listener = listener;
  }

  @Override
  public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    //..	 
    return new MyViewHolder(view, listener);
  }

}


public class MyActivity extends AppCompatActivity {  
  
  @Override  
  protected void onCreate(Bundle savedInstanceState) {  

    MyViewHolder.OnClickPartsListener listener =
      new MyViewHolder.OnClickPartsListener() {
  
        public void onClickText(String message) {
          Toast.makeText(this, message, LENGTH_SHORT).show();  
        }

        public void onClickImage(String message) {
          Toast.makeText(this, message, LENGTH_SHORT).show();  
        }

      };

    recyclerView = (RecyclerView) findViewById(R.id.recycler_view);  
    adapter = new MyAdapter(listener) {  
    recyclerView.setAdapter(adapter);  

  }

}

めんどくさいので,


public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {

  private final PublishSubject<String> onClickSubject = PublishSubject.create();

  @Override 
  public void onBindViewHolder(final ViewHolder holder, int position) {

    final Item item = items.get(position);

    holder.itemView.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        onClickSubject.onNext(item);
      }
    });
  }

  public Observable<String> getPositionClicks(){
    return onClickSubject.asObservable();
  }

}

または, イベントバス..

まとめ

親や祖父母側で実装した子や孫のインターフェースをコンストラクタ経由で渡し返す.

tag を上手に使うとよい.


よくある Observable の入れ子ができない頭の硬さ乙

99

なぜか長ったらしくなる Observable のネスト.


Observable.just("yo")
    .flatMap(s -> Observable.range(0, 100))
    .subscribe(integer -> Ln.d("Here's an Integer(%s), but how do I access that juicy String?", integer));

Passing composite data through flatMap and similar operators without creating container objects · Issue #2931 · ReactiveX/RxJava

よくあるくせに綺麗に書けない.

そんなわたし乙.

lambda も絡めてゆっくりと眺める.

元.


Observable.just("yo")
    .flatMap(new Func1<String, Observable<? extends Integer>>() {
      @Override public Observable<? extends Integer> call(String s) {
        return Observable.range(0, 100);
      }
    })
    .map(new Func1<Integer, String>() {
      @Override public String call(Integer integer) {
        return String.format("Here's an Integer(%s), but how do I access that juicy String?", integer);
      }
    })
    .subscribe(new Action1<String>() {
      @Override public void call(String x) {
        System.out.println(x);
      }
    });

flatMap(Func1, Func2) でやる場合.


Observable.just("yo")
    .flatMap(new Func1<String, Observable<? extends Integer>>() {
      @Override public Observable<? extends Integer> call(String s) {
        return Observable.range(0, 100);
      }
    }, new Func2<String, Integer, String>() {
      @Override public String call(String s, Integer integer) {
        return String.format("Here's an Integer(%s), with String(%s)", integer, s);
      }
    })
    .subscribe(new Action1<String>() {
      @Override public void call(String x) {
        System.out.println(x);
      }
    });

flatmap に map を入れ子でやる場合.


Observable.just("yo")
    .flatMap(new Func1<String, Observable<? extends String>>() {
      @Override public Observable<? extends String> call(String s) {
        return Observable.range(0, 100)
            .map(new Func1<Integer, String>() {
              @Override public String call(Integer integer) {
                return String.format("Here's an Integer(%s), with String(%s)", integer, s);
              }
            });
      }
    })
    .subscribe(new Action1<String>() {
      @Override public void call(String x) {
        System.out.println(x);
      }
    });
  }

lambda へ

元.


Observable.just("yo")
    .flatMap(s -> Observable.range(0, 100))
    .map(integer -> String.format("Here's an Integer(%s), but how do I access that juicy String?", integer))
    .subscribe(System.out::println);

flatMap(Func1, Func2) でやる場合.


Observable.just("yo")
    .flatMap(s -> Observable.range(0, 100),
        (s, integer) -> String.format("Here's an Integer(%s), with String(%s)", integer, s))
    .subscribe(System.out::println);

flatmap に map を入れ子でやる場合.


Observable.just("yo")
    .flatMap(s -> Observable.range(0, 100)
        .map(integer -> String.format("Here's an Integer(%s), with String(%s)", integer, s)))
    .subscribe(System.out::println);

まとめ

flatmap に map を入れるのがわかりやすいように思います.

慣れたらラムダも直感的です.

Feature request: @Passthru variable for Rx chains · Issue #855 · square/retrofit