プライバシーポリシー
1. 特定の個人を識別可能とする個人情報は取得しておりません。
2. 本アプリ(または、サービス・以下省略) を使用したことによる一切の損害について、開発者は責任を負いません。
3. 本アプリでは、第三者サービスを使用しています。本アプリで使用している第三者サービスの利用規約は以下の通りです。
firebase
https://firebase.google.com/terms/
4. 本項は予告なく改定することがあります。あらかじめご了承ください。
1. 特定の個人を識別可能とする個人情報は取得しておりません。
2. 本アプリ(または、サービス・以下省略) を使用したことによる一切の損害について、開発者は責任を負いません。
3. 本アプリでは、第三者サービスを使用しています。本アプリで使用している第三者サービスの利用規約は以下の通りです。
firebase
https://firebase.google.com/terms/
4. 本項は予告なく改定することがあります。あらかじめご了承ください。
ふと、こういう書き込みを見つけた。


国税庁 - 仮想通貨に関する所得の計算方法等について(情報)
雑所得扱いとなる申告が怖くて面倒くさいので利確できない
↓
BTC下がる
↓
利益がある限り利確できない
↓
BTC下がる
↓
利益がなくなる
そんなビットコインに対しての日本人の状況。

ビットコイン、取引シェア日本4割 個人の投機大半 :日本経済新聞
2017-12-22 18:36 現在まさしくその流れ。

日本人はほんとに養分となってしまうのか。
がんばれ日本! 負けるな日本!
ややこしすぎな気がします。
この記事のタイトルも書いてて意味不明です。
以下のような、FCMにJSONをPOSTしてアプリで受ける場合の話です。
curl https://fcm.googleapis.com/fcm/send -X POST \
--header "Authorization: key=FirebaseConsoleのプロジェクトの設定、クラウドメッセージングのタブにあるサーバーキー" \
--Header "Content-Type: application/json" \
-d '
{
"to":"/topics/all",
"data":{
"title":"New Notification!",
"body":"Test"
},
"priority":"high"
}'
このPOSTするJSONに含まれるデータ構造によって、アプリ側で受信する場合の処理の流れ変わって見通しが悪くなります。
きれいにまとめられています。
Firebase Notificationでアプリの状態による挙動の違いについて - Qiita
アプリがフォアグラウンドにある場合、このServiceのonMessageReceived()が呼び出されることになります。
アプリがバックグラウンドにある場合はこのonMessageReceived()は呼ばれることはなく、システム側で自動的にシステムトレイに通知を表示します。
"data"ブロックはConsoleからも含めることはできます(詳細オプションのカスタムデータで指定できる)。しかし、Consoleでは"notification"ブロックを省略することができません(メッセージ文を入力しないと送信できない)。
送信したメッセージに"data"ブロックがあっても、"notification"ブロックが存在する限り、アプリがバックグラウンドにある状態ではFirebaseMessagingServiceのonMessageReceived()は呼ばれません。
"data"ブロックの内容を受け取れないわけではありません。通知をクリックして起動したActivityのintentに含まれることになります。
"data"ブロックの内容の処理が、フォアグラウンド時に受け取ったときはFirebaseMessagingServiceで、バックグラウンドのときにはActivityでとなってしまって煩雑です。
実際に試してみると、これら書かれてることすごく良く分かります。
結局、この"notification"ブロックの特典としては、
アプリがバックグラウンド状態で受信した場合にのみ、アプリ側の実装なしで通知トレイに入る。
ということだけでしょうか、おおまかですが。
すべてのメッセージ受信時にonMessageReceived()が呼び出されれば、アプリがフォアグラウンドにあるかバックグラウンドにあるかを気にする必要がなくなります。
なるほど。

では、入れ子にしたらいいんじゃないかと。
例えば、
{
// ...
"notification": {
"title" : "News!!",
"body" : "New Product Release!!"
},
"data": {
"user": "Yamada Taro",
"age": 20
},
// ...
}
を以下のように入れ子にする。
{
// ...
"data": {
"user": "Yamada Taro",
"age": 20,
"notification": {
"title" : "News!!",
"body" : "New Product Release!!"
}
},
// ...
}
すべてサービスで受けることができます。
class MyFirebaseMessagingService : FirebaseMessagingService() {
override fun onMessageReceived(message: RemoteMessage) {
// ...
// 2層目以下はStringで送られてくるのでMap化
message.data["notification"]?.let {
val notification : Map<String, String> =
Gson().fromJson(it, object : TypeToken<HashMap<String, String>>() {}.type)
sendNotification(notification)
}
}
// サンプルを参考に
private fun sendNotification(notification: Map<String, String>) {
val intent = Intent(this, MainActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
val pendingIntent = PendingIntent.getActivity(this, 0, intent,
PendingIntent.FLAG_ONE_SHOT)
val channelId = getString(R.string.default_notification_channel_id)
val defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
val notificationBuilder = NotificationCompat.Builder(this, channelId)
.setSmallIcon(android.R.drawable.ic_notification_overlay)
.setContentTitle(notification["title"])
.setContentText(notification["body"])
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent)
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.notify(0, notificationBuilder.build())
}
quickstart-android/MyFirebaseMessagingService.java at master · firebase/quickstart-android
元々、Firebase てのは、敷居を下げてマーケティングなどに利用を広めようとしてるのかな。
ネットの中立性があやしくなってきていますが。
米、「ネットの中立性」撤廃 コンテンツの扱い格差容認 (写真=AP) :日本経済新聞
で、最近のニュース。
GoogleはEcho Show向けにAmazonが用意したYouTubeアプリがGoogleの利用規約に違反しているとして、Echo ShowでYouTubeを使えないようにしました。その直後、AmazonはGoogle系列のスマートホーム企業Nestの一部製品をAmazonで販売停止にして対抗します。
AmazonとGoogleのバトルが激化 ユーザー不在の締め出し合戦へ - ITmedia PC USER
そんなことを考えながら、
ADBをアップデートして少しビビる、今日。
ビルドツールを更新すると、OS X上でADBが動作しなくなる
Updating to build tools 27.0.2 breaks ADB on OS X : androiddev
$ cd $ANDROID_SDK_ROOT
$ rm -r platform-tools/
$ curl https://dl.google.com/android/repository/platform-tools_r26.0.2-darwin.zip -o platform-tools_r26.0.2-darwin.zip
$ unzip platform-tools_r26.0.2-darwin.zip
iPhone の Apple をGoogleの敵と単純に考えてしまってはいけませんね。
すいません。
MVP、MVVM、Clean Architecture、Dagger2、Data Binding、Archtecture Components などいろいろな組み合わせの実装例が ToDoアプリにて公開されています。
非同期処理部分を見てみると現在はすべて(todo-mvp-rxjavaを除く)が以下の実装となり、非同期処理の主役であった AsyncTask/Loader API を利用した記述は消え去っています。
まず、java.util.concurrent.Executor(s) を使って、AppExecutors を作っておいて、
open class AppExecutors constructor(
val diskIO: Executor = DiskIOThreadExecutor(),
val networkIO: Executor = Executors.newFixedThreadPool(THREAD_COUNT),
val mainThread: Executor = MainThreadExecutor()
) {
private class MainThreadExecutor : Executor {
private val mainThreadHandler = Handler(Looper.getMainLooper())
override fun execute(command: Runnable) {
mainThreadHandler.post(command)
}
}
}
それに対応するデータベースやストレージ向けのExecutorを作ります。
class DiskIOThreadExecutor : Executor {
private val diskIO = Executors.newSingleThreadExecutor()
override fun execute(command: Runnable) { diskIO.execute(command) }
}
これらを使って以下のようにして非同期処理を実装します。
appExecutors.diskIO.execute {
// IOスレッドで実行する
// ...
appExecutors.mainThread.execute {
// メインスレッドで実行する
// ...
}
}
実装例では、コールバックを使ってPresenterまで伝達しています。
override fun getTasks(callback: TasksDataSource.LoadTasksCallback) {
appExecutors.diskIO.execute {
// IOスレッドで実行する
val tasks = tasksDao.getTasks()
appExecutors.mainThread.execute {
// メインスレッドで実行する
if (tasks.isEmpty()) {
callback.onDataNotAvailable()
} else {
callback.onTasksLoaded(tasks)
}
}
}
}
AsyncTask/Loader APIs の排除の方向性は、「Deprecated(廃止予定) samples」に移動されたブランチからも認識できます。

この流れについては、droidcon NYC 2017 - Android Architecture Round Table でも、話が挙がっていました。
it looks like Google is abandoning old API is like loaders and recommending patterns there are much less coupled with the framework, which is good but what happens with these API is are we abundant in then and I'm talking about classes like sync adapters loader async tasks etc
Google はLoaderのような古いAPI や フレームワークと関係の薄いパターンを推奨することをやめているように見えます。 それはいいことですが、それら古いAPIを捨てることは何を引き起こすか、AsyncAdapter や Loaderなどについて話したいと思います。
今後の、Android SDKは、フレームワークを意識したAPIが増えていくのでしょう。