目的
Android 版 LINE の通知を再現するスタディです。
ここでは、メッセージを受け取った時に表示されるLINEの画面を、ポップアップActivityと呼びます。
観察すると、以下の仕様のようです。(Android 5.0で観察)
- ポップアップ表示がONの時
- ホーム画面でメッセージを受け取ると、バイブと音が鳴り、割り込んでポップアップActivityが表示される。通知センターに通知も追加されている。
- ロック画面でメッセージを受け取ると、ポップアップActivityが表示される。戻るボタンを押すと、ロックスクリーンに通知が追加されている。
- 画面がOFFの状態でメッセージを受け取ると、バイブと音が鳴り、画面がONになりポップアップActivityが表示される。
- ポップアップ表示がOFFの時
- 画面がOFFの状態でメッセージを受け取ると、バイブと音がなる。画面はOFFのまま。
- ロック画面でメッセージを受け取ると、バイブと音が鳴り、通知が表示される。
- ホーム画面でメッセージを受け取ると、バイブと音が鳴り、通知センターに通知が追加される。
- その他の情報
- LINE内で該当のスレッドを開いている場合、通知もポップアップActivityも表示されない。
- LINE内で設定画面などを開いている場合、通知のみ追加される。
因数分解すると、メッセージを受け取った時に
- 通知センターに通知を追加し、音とバイブを鳴らす処理
- ポップアップアクティビティを表示し、画面をONにする処理
の2つの処理に分けられることが分かります。
実装
表示させる Activity を作成
- app用build.gradleで、minSdkVersionを17以上に設定。
- 表示させる HogeActivity を普通に作成
- HogeActivity に以下のコードを追加
HogeActivity.java
@Override
public void onAttachedToWindow() {
Window window = getWindow();
window.addFlags(
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
);
}
- res/values/styles.xml に以下のコードを追加
res/values/styles.xml
<style name="Translucent" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:colorBackgroundCacheHint">@null</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowAnimationStyle">@android:style/Animation</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowContentOverlay">@null</item>
</style>
- AndroidManifest.xml に定義された HogeActivity を以下のように設定
AndroidManifest.xml
<activity android:name=".activities.HogeActivity"
android:showOnLockScreen="true"
android:theme="@style/Translucent"
android:launchMode="singleInstance"/>
作成した Activity を表示
たとえばプッシュ通知を受け取ったタイミングなどで以下を実行すると、Activityを表示できます。
// アクティビティを表示
void showActivity( Context context ){
Intent intent = new Intent(context, KindlizedNotificationActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context,0, intent, 0);
try {
pendingIntent.send();
} catch (Throwable e){
Logging.error(e);
}
}