閲覧いただきありがとうございます。
アプリをキルしても動的に表示し続ける通知を作ろうとしています。
そのため下記のように onStop時にServiceクラスに移行し、同時にSetNotificationクラスをServiceクラスに渡そうとしています。
こちらを参考にしました。
※Serviceクラスとはプログラム内で明示的に停止させない限り、アプリをキルしてもバックグラウンドで動き続ける特殊なクラス
kotlin
1// 通知サービスを開始する 2 override fun onStop() { 3 super.onStop() 4 5 val serviceIntent = Intent(this, NotificationService::class.java) 6 serviceIntent.putExtra("key1", setNotification) 7 startService(serviceIntent) 8 }
受け取り側(Serviceクラス)
kotlin
1override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { 2 3 if (intent != null) { 4 setNotification = intent.getSerializableExtra("key1") as SetNotification 5 setNotification.setNotificationChannel() 6 } 7 return START_NOT_STICKY 8 }
SetNotificationクラスは Serviceクラスで通知をセットするための処理がまとめられています。
kotlin
1class SetNotification(mainActivity:Activity, notificationManager:NotificationManager) : 2 Serializable { 3 4 private val CHANNEL_ID = "123" 5 private var notificationManager: NotificationManager 6 private var mainActivity : Activity 7 private val handler = Handler() 8 private var runnable = Runnable {} 9 10 11 init { 12 this.mainActivity = mainActivity 13 this.notificationManager = notificationManager 14 } 15 16 〜〜〜省略〜〜〜 17}
しかしonStopを実行してみるとエラーが発生して通知が表示されないです。
Logcat
1--------- beginning of crash 22022-04-19 16:09:41.613 19443-19443/com.Create12c.cpubatteryindicatorinstatusbar E/AndroidRuntime: FATAL EXCEPTION: main 3 Process: com.Create12c.cpubatteryindicatorinstatusbar, PID: 19443 4 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) 5 at android.app.ActivityThread.callActivityOnStop(ActivityThread.java:5410) 6 at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:5345) 7 at android.app.ActivityThread.handleStopActivity(ActivityThread.java:5455) 8 at android.app.servertransaction.StopActivityItem.execute(StopActivityItem.java:40) 9 at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176) 10 at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97) 11 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2325) 12 at android.os.Handler.dispatchMessage(Handler.java:106) 13 at android.os.Looper.loop(Looper.java:246) 14 at android.app.ActivityThread.main(ActivityThread.java:8633) 15 at java.lang.reflect.Method.invoke(Native Method) 16 at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) 17 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130) 18 Caused by: java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.Create12c.cpubatteryindicatorinstatusbar.SetNotification) 19 at android.os.Parcel.writeSerializable(Parcel.java:2125) 20 at android.os.Parcel.writeValue(Parcel.java:1895) 21 at android.os.Parcel.writeArrayMapInternal(Parcel.java:987) 22 at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1620) 23 at android.os.Bundle.writeToParcel(Bundle.java:1303) 24 at android.os.Parcel.writeBundle(Parcel.java:1056) 25 at android.content.Intent.writeToParcel(Intent.java:11512) 26 at android.app.IActivityManager$Stub$Proxy.startService(IActivityManager.java:6800) 27 at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1780) 28 at android.app.ContextImpl.startService(ContextImpl.java:1740) 29 at android.content.ContextWrapper.startService(ContextWrapper.java:738) 30 at android.content.ContextWrapper.startService(ContextWrapper.java:738) 31 at com.Create12c.cpubatteryindicatorinstatusbar.MainActivity.onStop(MainActivity.kt:215) 32 at android.app.Instrumentation.callActivityOnStop(Instrumentation.java:1476) 33 at android.app.Activity.performStop(Activity.java:8438) 34 at android.app.ActivityThread.callActivityOnStop(ActivityThread.java:5402) 35 at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:5345) 36 at android.app.ActivityThread.handleStopActivity(ActivityThread.java:5455) 37 at android.app.servertransaction.StopActivityItem.execute(StopActivityItem.java:40) 38 at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176) 39 at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97) 40 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2325) 41 at android.os.Handler.dispatchMessage(Handler.java:106) 42 at android.os.Looper.loop(Looper.java:246) 43 at android.app.ActivityThread.main(ActivityThread.java:8633) 44 at java.lang.reflect.Method.invoke(Native Method) 45 at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) 46 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130) 47 Caused by: java.io.NotSerializableException: android.app.ActivityManager 48 at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1240) 49 at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1604) 50 at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1565) 51 at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1488) 52 at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1234) 53 at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:354) 54 at android.os.Parcel.writeSerializable(Parcel.java:2120) 55 at android.os.Parcel.writeValue(Parcel.java:1895) 56 at android.os.Parcel.writeArrayMapInternal(Parcel.java:987) 57 at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1620) 58 at android.os.Bundle.writeToParcel(Bundle.java:1303) 59 at android.os.Parcel.writeBundle(Parcel.java:1056) 60 at android.content.Intent.writeToParcel(Intent.java:11512) 61 at android.app.IActivityManager$Stub$Proxy.startService(IActivityManager.java:6800) 62 at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1780) 63 at android.app.ContextImpl.startService(ContextImpl.java:1740) 64 at android.content.ContextWrapper.startService(ContextWrapper.java:738) 65 at android.content.ContextWrapper.startService(ContextWrapper.java:738) 66 at com.Create12c.cpubatteryindicatorinstatusbar.MainActivity.onStop(MainActivity.kt:215) 67 at android.app.Instrumentation.callActivityOnStop(Instrumentation.java:1476) 68 at android.app.Activity.performStop(Activity.java:8438) 69 at android.app.ActivityThread.callActivityOnStop(ActivityThread.java:5402) 70 at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:5345) 71 at android.app.ActivityThread.handleStopActivity(ActivityThread.java:5455) 72 at android.app.servertransaction.StopActivityItem.execute(StopActivityItem.java:40) 73 at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176) 74 at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97) 75 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2325) 76 at android.os.Handler.dispatchMessage(Handler.java:106) 77 at android.os.Looper.loop(Looper.java:246) 78 at android.app.ActivityThread.main(ActivityThread.java:8633) 79 at java.lang.reflect.Method.invoke(Native Method) 80 at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) 81 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
こちらを参考にすると、どうやらSetNotificationのプロパティがSerializableを継承していないのが原因だったようなので mainActivityなどにもSerializableを継承したのですが結果は同じでした。
どうしたらServiceクラス移行時に、Serviceクラスに独自クラスを渡すことができるでしょうか?
どうかご教授お願い致します。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。