閲覧いただきありがとうございます。
アプリをキルしても動的に表示し続ける通知を作ろうとしています。
そのため下記のように onStop時にServiceクラスに移行し、同時にSetNotificationクラスをServiceクラスに渡そうとしています。
こちらを参考にしました。
※Serviceクラスとはプログラム内で明示的に停止させない限り、アプリをキルしてもバックグラウンドで動き続ける特殊なクラス
kotlin
// 通知サービスを開始する override fun onStop() { super.onStop() val serviceIntent = Intent(this, NotificationService::class.java) serviceIntent.putExtra("key1", setNotification) startService(serviceIntent) }
受け取り側(Serviceクラス)
kotlin
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { if (intent != null) { setNotification = intent.getSerializableExtra("key1") as SetNotification setNotification.setNotificationChannel() } return START_NOT_STICKY }
SetNotificationクラスは Serviceクラスで通知をセットするための処理がまとめられています。
kotlin
class SetNotification(mainActivity:Activity, notificationManager:NotificationManager) : Serializable { private val CHANNEL_ID = "123" private var notificationManager: NotificationManager private var mainActivity : Activity private val handler = Handler() private var runnable = Runnable {} init { this.mainActivity = mainActivity this.notificationManager = notificationManager } 〜〜〜省略〜〜〜 }
しかしonStopを実行してみるとエラーが発生して通知が表示されないです。
Logcat
--------- beginning of crash 2022-04-19 16:09:41.613 19443-19443/com.Create12c.cpubatteryindicatorinstatusbar E/AndroidRuntime: FATAL EXCEPTION: main Process: com.Create12c.cpubatteryindicatorinstatusbar, PID: 19443 java.lang.RuntimeException: Unable to stop activity {com.BSCreate.cpubatteryindicatorinstatusbar/com.Create12c.cpubatteryindicatorinstatusbar.MainActivity}: java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.Create12x.cpubatteryindicatorinstatusbar.SetNotification) at android.app.ActivityThread.callActivityOnStop(ActivityThread.java:5410) at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:5345) at android.app.ActivityThread.handleStopActivity(ActivityThread.java:5455) at android.app.servertransaction.StopActivityItem.execute(StopActivityItem.java:40) at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2325) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:246) at android.app.ActivityThread.main(ActivityThread.java:8633) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130) Caused by: java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.Create12c.cpubatteryindicatorinstatusbar.SetNotification) at android.os.Parcel.writeSerializable(Parcel.java:2125) at android.os.Parcel.writeValue(Parcel.java:1895) at android.os.Parcel.writeArrayMapInternal(Parcel.java:987) at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1620) at android.os.Bundle.writeToParcel(Bundle.java:1303) at android.os.Parcel.writeBundle(Parcel.java:1056) at android.content.Intent.writeToParcel(Intent.java:11512) at android.app.IActivityManager$Stub$Proxy.startService(IActivityManager.java:6800) at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1780) at android.app.ContextImpl.startService(ContextImpl.java:1740) at android.content.ContextWrapper.startService(ContextWrapper.java:738) at android.content.ContextWrapper.startService(ContextWrapper.java:738) at com.Create12c.cpubatteryindicatorinstatusbar.MainActivity.onStop(MainActivity.kt:215) at android.app.Instrumentation.callActivityOnStop(Instrumentation.java:1476) at android.app.Activity.performStop(Activity.java:8438) at android.app.ActivityThread.callActivityOnStop(ActivityThread.java:5402) at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:5345) at android.app.ActivityThread.handleStopActivity(ActivityThread.java:5455) at android.app.servertransaction.StopActivityItem.execute(StopActivityItem.java:40) at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2325) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:246) at android.app.ActivityThread.main(ActivityThread.java:8633) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130) Caused by: java.io.NotSerializableException: android.app.ActivityManager at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1240) at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1604) at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1565) at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1488) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1234) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:354) at android.os.Parcel.writeSerializable(Parcel.java:2120) at android.os.Parcel.writeValue(Parcel.java:1895) at android.os.Parcel.writeArrayMapInternal(Parcel.java:987) at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1620) at android.os.Bundle.writeToParcel(Bundle.java:1303) at android.os.Parcel.writeBundle(Parcel.java:1056) at android.content.Intent.writeToParcel(Intent.java:11512) at android.app.IActivityManager$Stub$Proxy.startService(IActivityManager.java:6800) at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1780) at android.app.ContextImpl.startService(ContextImpl.java:1740) at android.content.ContextWrapper.startService(ContextWrapper.java:738) at android.content.ContextWrapper.startService(ContextWrapper.java:738) at com.Create12c.cpubatteryindicatorinstatusbar.MainActivity.onStop(MainActivity.kt:215) at android.app.Instrumentation.callActivityOnStop(Instrumentation.java:1476) at android.app.Activity.performStop(Activity.java:8438) at android.app.ActivityThread.callActivityOnStop(ActivityThread.java:5402) at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:5345) at android.app.ActivityThread.handleStopActivity(ActivityThread.java:5455) at android.app.servertransaction.StopActivityItem.execute(StopActivityItem.java:40) at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2325) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:246) at android.app.ActivityThread.main(ActivityThread.java:8633) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
こちらを参考にすると、どうやらSetNotificationのプロパティがSerializableを継承していないのが原因だったようなので mainActivityなどにもSerializableを継承したのですが結果は同じでした。
どうしたらServiceクラス移行時に、Serviceクラスに独自クラスを渡すことができるでしょうか?
どうかご教授お願い致します。
まだ回答がついていません
会員登録して回答してみよう