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

「通知をONにしているのに表示されないんだけど...」

ありますよね!

実際, 設定が多すぎて分かりづらいです.

ネット上の情報も, OSバージョンや機種の違いなどでさらに混乱します.

とりあえず, すべての設定項目を列挙してみます.

そのアプリ内での「設定」

そのアプリの中の「設定」をONにします.

LINEの場合は以下のような画面ですね.

20161125-152024

OSの設定「アプリ」から

OSの「設定」アイコンから「アプリ」を選択.

そして対象アプリを選択後,「通知を表示」のチェックボックスをONにします.

20161125-153800

ネット上にこの設定の話がたくさんありますが, Android 6.x (Marshmallow) では, このチェックボックはなかったりします.

OSの設定「通知」から

OSの「設定」アイコンから「通知」を選択.

「ヘッドアップ」「端末がロック」とよくわからない言葉が表示されていますが, とりあえず上から2つをONにしていきます.

20161125-154834

続いてその下の「アプリの通知」をタップして対象のアプリを選択して

「ブロック」はOFFに, ロック画面に表示」をONにします.

20161125-155321

この画面は, Android 6.0 では, こんな画面なので, 1つOFF, 2つONにします.

20161125-160017

続いて, 私がはまっていた「フィルタリング」の設定です.

通知バーが表示されたときに, 長押しからなんとなくこの「フィルタリング」を押してしまっている人が多いのではないかと思います.

20161125-161030

簡単に非表示にできるわりには, 再度表示させるときの設定がわかりずらいです.

先ほどの「通知」の画面で「通知のフィルタリング」をタップします.

20161125-161447

「フィルタリング(無視して表示しない)」している通知が一覧で表示されます.

20161125-161727

この中から復活表示したい通知をタップすると, 無視された回数などが表示されますので, ここで「削除」を押すとフィルターから除外されて表示されるようになります!

20161125-162824

まとめ

「通知する」をONにしたあと, 「ブロック」と「フィルター」をOFFにする.

OS設定は「設定-通知」と「設定-アプリ」の2つの中のどこかにある.

設定多すぎ.

👉 【Android10/11】通知が来ない、遅れるときに見直すべき「電池(バッテリー)の最適化」 

👉【Android Pie】「通知」設定のシンプルな考え方


Chromecast のボタンが表示されなくなった場合

ここ数日間, 使いづらいなあと思いながら過ごしていましたが.

「Chromecast のボタンが表示されない」

%e6%84%9b%e7%8a%ac%e3%81%ab%e9%87%8e%e6%80%a7%e3%82%aa%e3%82%aa%e3%82%ab%e3%83%9f%e3%81%8b%e3%82%99%e8%bf%91%e3%81%a4%e3%82%99%e3%81%84%e3%81%9f%e3%81%a8%e3%81%8d%e3%80%81%e5%bd%bc%e3%81%af%e3%81%aa

もう今後はこの仕様になったのかと思っていました.

ふと, 画面左下にこんなマークが表示されてる.

youtube

押すと, 以前の画面に戻れるようです.

youtube-2

使えるようになりました.

%e7%8a%ac%e3%81%97%e3%82%99%e3%82%83%e3%81%aa%e3%81%84__%e3%81%99%e3%82%99%e3%81%a3%e3%81%a8%e4%b8%80%e7%b7%92%e3%81%9f%e3%82%99%e3%81%a3%e3%81%9f%e6%84%9b%e7%8a%ac%e3%81%a8%e7%aa%81%e7%84%b6%e3%81%ae

このボタン表示されなくても, Chrome ブラウザのメニューに新しく追加された「キャスト」を選択してテレビに送信もできたけど, 「タブごと」か「デスクトップ」の選択しかなく, なんだかパソコンに負荷がかかるような.

こんな, 実験的(?)な画面の更新, いつからされてたのかっ???


「これより速いのがあったら言ってこい」Google非公式DIフレームワーク Tiger 登場!!

Google製のライブラリが集まっていいるGitHubリポジトリがありますが.

Google

Google

DIフレームワークが新しく登場しています.

google_tiger

google/tiger

DISCLAIMER: This is not an official Google product. Google's production dependency injection frameworks are Dagger and Guice.

Dagger や Guice があるので, このフレームワークは「非公式」ということですが, 速さの面で気持ちいい啖呵を切っているようにも見えます.

Challenge

If one found a DI framework faster, let me know. I will drop the title as long as it is proved.

「これより速いの見つけたら教えてね♥」

Group

[email protected]

と, メールアドレスもこだわっています.

サンプルを見た感じアノテーションを利用した Dagger とよく似た雰囲気になっておりますが, それぞれのスコープに対してひとつのインジェクターを生成するしくみのようです.


public class PseudoActivity {
  @Inject
  Foo foo;

  @Inject
  @BarAnnotation
  Bar bar;

  @Inject
  @BarAnnotation
  Bar bar2;

  @Inject
  Baz baz;
  
  @Inject
  Shboom shboom;

  void onCreate(DaggerApplicationComponent applicationComponent) {
    DaggerActivityComponent activityComponent =
        new DaggerActivityComponent.Builder().daggerApplicationComponent(applicationComponent).build();
    activityComponent.injectPseudoActivity(this);
  }

  @Override
  public String toString() {
    return "PseudoActivity[foo: " + foo + ", bar: " + bar + " bar2: " + bar2 + ", baz: " + baz
        + " shboom: " + shboom + "]";
  }
}

こんなかんじで最近はGoogleから実験的なライブラリが公開されるようになってきていますが, どれも微妙な雰囲気はあります.

Include the "not an official Google product" disclaimer by gk5885 · Pull Request #3 · google/tiger

これ, 今後どうなっていくのでしょうかー.

Google発リアクティブなライブラリ「Agera」の評判を眺める


DiffUtil で簡単に RecyclerView を更新する

list_mail

例えば, RecyclerView で一覧を作成して表示しているとして


1. 田中一郎
2. 佐藤二郎
3. 鈴木三郎
....

サーバなどに問い合わせて取得された以下データ


1. 田中一郎
2. ジローラモ
3. 鈴木三郎
...

を一覧画面に反映させたい場合.

RecyclerView.Adapter に更新を通知する場合,

RecyclerView.Adapter | Android Developers

notify*() のうちアイテムの更新に関するものは


notifyDataSetChanged()
notifyItemChanged(int position, Object payload)
notifyItemChanged(int position)
notifyItemRangeChanged(int positionStart, int itemCount, Object payload)
notifyItemRangeChanged(int positionStart, int itemCount)

ですが, それぞれ以下の面倒な部分がありました.


notifyDataSetChanged()

→ 変更部分のみに関してのアニメーションが表示されない.


notifyItemChanged(int position, Object payload)
notifyItemChanged(int position)
notifyItemRangeChanged(int positionStart, int itemCount, Object payload)
notifyItemRangeChanged(int positionStart, int itemCount)

→ アニメーションは表示されるが, 変更部分の position を計算して渡す必要がある.

その他 hasStableIds() と Loader を使ったりなど面倒でしたよね.

DiffUtil を使う

support-library-v7 24.2.0 で登場の DiffUtil を使いましょう.

DiffUtil | Android Developers

コールバッククラス作成後, それを使った更新メソッドを Adapter 内に記述します.

MyDiffUtilCallback.java


public class MyDiffUtilCallback extends DiffUtil.Callback{

    List<Person> oldPersons;
    List<Person> newPersons;

    public MyDiffUtilCallback(List<Person> oldPersons, List<Person> newPersons) {
        this.oldPersons = oldPersons;
        this.newPersons = newPersons;
    }

    @Override
    public int getOldListSize() {
        return oldPersons.size();
    }

    @Override
    public int getNewListSize() {
        return newPersons.size();
    }

    @Override
    public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
        return oldPersons.get(oldItemPosition).id == newPersons.get(newItemPosition).id;
    }

    @Override
    public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
        return oldPersons.get(oldItemPosition).equals(newPersons.get(newItemPosition));
    }

    @Nullable
    @Override
    public Object getChangePayload(int oldItemPosition, int newItemPosition) {
	// some additional information
        return super.getChangePayload(oldItemPosition, newItemPosition);
    }
}

MyRecyclerViewAdapter.java


public void updateList(ArrayList<Person> newList) {
        DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new MyDiffUtilCallback(this.persons, newList));
        diffResult.dispatchUpdatesTo(this);
}

これで, アイテムのポジションの計算はおまかせにして, 同時に綺麗なアニメーションが変更部分に適用されます.

実際, データ量が多い場合は厳しいようなので, RxJava なら メインスレッドにて以下.


@Override
public void onNext(DiffUtil.DiffResult result) {
    result.dispatchUpdatesTo(mProductAdapter);
}

kotlinなら同様に以下。


internal class DiffUtilCallback(
    private val oldItems: List<Item>,
    private val newItems: List<Item>
) : DiffUtil.Callback() {

  override fun getOldListSize() = oldItems.size

  override fun getNewListSize() = newItems.size

  override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int)
      = oldItems[oldItemPosition].id == newItems[newItemPosition].id

  override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int)
      = oldItems[oldItemPosition] == newItems[newItemPosition]
}

以下のように使うと便利かもしれません.

リアクティブにデータ更新検知して自動画面更新させる


いまどきの MVP 実装パターンを眺めるべし「Android Architecture Blueprints」

このような, 質問がありました.

こんにちは。

私はアプリの開発を2年ほどやっているものです。
しかし, いつも似たようなコードの繰り返しばかりで少しも進歩していないように思っています。

小さい会社なので, モバイルアプリ開発者は私だけで, だれも私のコードを見ることがないので, 私のコードの間違いを指摘されることはなく, 会社で開発されている他のコードを見ることもありません。

最新技術を利用しすばらしい実装を行っているオープンソースアプリのコードを勉強したいです。

そのようなアプリをどこで見つけたらよいか教えて下さい。

よろしくお願いいたします。

I would like to study some up-to-date open source apps, preferably with material design, do you have any suggestions? : androiddev

このような環境で日々を過ごし, 似たようなことを考えてる開発者は多いと思います。

以下のサイトはいかがでしょうか. よくある ToDo アプリでのサンプルとなっています.

Android Architecture Blueprints [beta] - A collection of samples to discuss and showcase different architectural tools and patterns for Android apps.

ここでフォーカスされているのは, 構造, 設計, テスト, メンテナンスのしやすさですが, リファレンスとして, または, アプリ開発のスタート地点として利用できます.

MVP (基本的な Model-View-Presenter)

googlesamples/android-architecture at todo-mvp

このサンプルはすべての基本となります. 構造を持つフレームワークを使わないシンプルな Model-View-Presenter パターンの実装例です. ローカル/リモートのデータソースである Repository を手作業で Dependency Injection しています. 非同期処理はコールバックを利用しています.

mvp

MVP + Loader

googlesamples/android-architecture at todo-mvp-loaders

Repository から Loader を使ってデータを取得します.

- コールバックなしで Repository 内のデータを非同期で読み込むことができる.
- データソースを監視しており, Repository の内容が変化すると新しい結果として配送できる.
- 画面回転のあと自動的に直近の Loader を再接続できる.

mvp-loaders

MVP + Loader + ContentProvider

googlesamples/android-architecture at todo-mvp-contentproviders

Repository からのデータ取得に ContentProvider を使います.

- 構造化されたデータへのアクセス操作可能.
- 別プロセスで稼働しているコードからデータへ接続できる標準的なインターフェースとなる.

mvp-contentproviders

MVP + DataBinding

googlesamples/android-architecture at todo-databinding

DataBiding ライブラリを利用して, UI要素にデータとアクションをバインドしています. 厳格には Model-View-ViewModel や Model-View-Presenter パターンではありません. ViewModel と Presenter 両方使用しています.

DataBinding ライブラリは, データとUI要素を連携する重複するコードを削減してくれます.

- レイアウトファイルがUI要素へのバインドに利用されている.
- 同時にイベントもアクションハンドラーと結合されている.
- データの監視が可能で必要であるときには自動で更新するようにセットすることができる.

mvp-databinding

MVP + Clean Architecture

googlesamples/android-architecture at todo-mvp-clean

Clean Architecture に基づいており, Presentation と Repository レイヤーの間に Domain レイヤーが存在して, アプリを3つのレイヤーに分けています.

Domain レイヤーでは, すべてのビジネスロジックを収納しており, Presenter に使われる use-case か interactor と命名されたクラスから始まる. これらの use-case は Presentation レイヤーから作ることができるすべての実装可能なアクションを提供します.

mvp-clean

その他

その他, 最近流行のフレームワークや考え方を考慮しての実装サンプルも続々と作成中のようです.

Architecture Blueprints の非同期処理実装にみる Android SDK の方向性

MVP + Dagger2
MVP + RxJava
MVP + Fragmentなし

非常に柔軟性のある使えるサンプルとなると思われます. ぜひご確認あれ.

Architecture Blueprints の非同期処理実装にみる Android SDK の方向性

Hacker News Radio (翻訳) - Google Play の Android アプリ