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度とこないように「通知履歴」から非表示設定する


JSR-310 で Date/Calendar を避けて通る

Android上で既存のフォーマットを利用して日時を表示しようとすると, android.text.format.DateUtils は利用したい.

「ThreeTenABP」で捨てれないのか android.text.format.DateUtils

JSR-310系の LocalDate などと Unixタイム間を自在に変換できない.

LocalDateTime系は時差情報を持たないので、時刻の起点が定まっていない(システム依存)という特徴があります。一方でInstantとjava.util.Dateは暗黙的にUTCという時差情報をもっており、時刻の起点が定まっています。これがLocalDateTime.toInstantなるメソッドがない理由です

Java8日付時刻APIの使いづらさと凄さ - きしだのはてな

「Local* は時刻の起点をもっていない」

ので, それを追加した ZonedDateTime/OffsetDateTime に一度変換して Instant を経由して Epoc へ, 逆も同じ要領で.


long epochSecondF = 1234567890;
long epochMilliF = epochSecondF * 1000L;

Instant instantF = Instant.ofEpochMilli(epochMilliF);
//Instant instantF = Instant.ofEpochSecond(epochSecond);

ZonedDateTime zonedDateTime = instantF.atZone(ZoneOffset.systemDefault());
//OffsetDateTime offsetDateTime = instantF
//    .atOffset(ZoneOffset.systemDefault().getRules().getOffset(Instant.EPOCH));

zonedDateTime = zonedDateTime
    .plusDays(123)
    .plusHours(123)
    .plusMinutes(123)
    .plusMonths(123)
    .plusWeeks(123)
    .minusDays(123)
    .with(TemporalAdjusters.lastDayOfMonth())
    .with(TemporalAdjusters.previousOrSame(DayOfWeek.SUNDAY));

//offsetDateTime = offsetDateTime
//    .plusDays(123);
//    .plusHours(123)
//    .plusMinutes(123)
//    .plusMonths(123)
//    .plusWeeks(123)
//    .minusDays(123)
//    .with(TemporalAdjusters.lastDayOfMonth())
//    .with(TemporalAdjusters.previousOrSame(DayOfWeek.SUNDAY));

Instant instantR = zonedDateTime.toInstant();
//Instant instantR = offsetDateTime.toInstant();

long epochMilliR = instantR.toEpochMilli();
//long epochSecondR = instantR.getEpochSecond();

のように, タイムゾーンやオフセットの情報は, Android端末の設定側から取得する.


ZoneOffset.systemDefault()


ZoneOffset.systemDefault().getRules().getOffset(Instant.EPOCH)

利用者の属するタイムゾーンを利用してカレンダー周りの計算をして, Epoch と行き来するなら,


  public static ZonedDateTime toZonedDateTime(long epochMilli) {
    return Instant.ofEpochMilli(epochMilli).atZone(ZoneId.systemDefault());
  }

  public static long toEpocMilli(ZonedDateTime zonedDateTime) {
    return zonedDateTime.toInstant().toEpochMilli();
  }

そして表示の前にフォーマットする.


String formatted = DateUtils.formatDateTime(context, toEpocMilli(zonedDateTime), 
       FORMAT_SHOW_YEAR | FORMAT_SHOW_DATE | FORMAT_SHOW_WEEKDAY | FORMAT_SHOW_TIME | FORMAT_ABBREV_ALL);

// 2016年12月14日(水) 10:13
// Wed, 14 Dec 2016 00:13
// Tue, Dec 13, 2016, 20:13
// 2016年12月14日週三 09:13
// 2016년 12월 14일 (수) 10:13
// ...

「ThreeTenABP」で捨てれないのか android.text.format.DateUtils


【本当に32ビット?】Android端末の CPU の ABI を特定する

なんとなく選択していた OpenGApps の「Platform」.

The Open GApps Project

この「ARM」とか「x86」ての結局何なのか.

調べてみました.

概要

「ABI (Application Binary Interface)」とは, Android のプロセッサーにセットされた命令の種類で, mylib.so のようなネイティブCライブラリをアプリに組み込むときにABIを特定してコンパイルする必要がある.

app/libs/armeabi/mylib.so
app/libs/x86/mylib.so

大きく3つのカテゴリに分けられる.


ARM
	- armeabi
	- armeabi-v7a
	- arm64-v8a
X86
	- x86
	- x86_64
MIPS
	- mips
	- mips64

それぞれのカテゴリ内は下のもののほうが新しく一般的に下位互換なので, arm64-v8 では armeabi-v7a 向けのアプリを使うことができる.

armeabi-v7a が多いが最近は arm64-v8a が増えてきている雰囲気.

Arm Arm64 x86 Selection Guide for Android -iTechify

Genymotionなどのエミュレータ や ASUS Zenphone 2 は x86 らしい.

端末のABIを特定する

コマンドラインから眺めてみたりしてましたが,

shell@mako:/ $ cat /proc/cpuinfo
Processor : ARMv7 Processor rev 2 (v7l)
processor : 0
BogoMIPS : 13.53
...

こっちの方が良さげ.

shell@mako:/ $ getprop | grep cpu
[ro.product.cpu.abi]: [armeabi-v7a]
[ro.product.cpu.abi2]: [armeabi]
[ro.product.cpu.abilist]: [armeabi-v7a,armeabi]
[ro.product.cpu.abilist32]: [armeabi-v7a,armeabi]
[ro.product.cpu.abilist64]: []

How to identify the android device is 32-bit or 64-bit ? | Intel® Software

コード内で取得するにはそれぞれ以下で.

Build.CPU_ABI | Android Developers

Build.CPU_ABI2 | Android Developers

Build.SUPPORTED_ABIS | Android Developers

まとめ

私のAndroidには「ARM」を選択しますわ!