質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

2回答

1324閲覧

【kotlin】putExtraとSerializableを使って Serviceクラスに 独自で作ったクラスを渡したい

Create12c

総合スコア52

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2022/04/19 08:43

編集2022/04/20 14:34

閲覧いただきありがとうございます。

アプリをキルしても動的に表示し続ける通知を作ろうとしています。

そのため下記のように 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クラスに独自クラスを渡すことができるでしょうか?

どうかご教授お願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

すみません、別の方法で解決しました。
putExtraとSerializableでクラスを渡すのは難しいため、新たにシングルトンなobject型のクラスを作り、その中に自作クラスを入れる公的変数を作ることで解決しました。
Serializable使って渡すことができなかったのは悔しいですが、お陰様で理解を深めることはできました。

投稿2022/04/20 05:34

Create12c

総合スコア52

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

# Android開発には暗い者です。

Caused by: java.io.NotSerializableException: android.app.ActivityManager

android.app.ActivityManagerがSerializableではないのが原因ですね。これをSerializableにはできないでしょうから、ActivityManagerを直接、または、間接的に参照しているフィールドに、@Transient注釈をつけるといいでしょう。シリアライズの対象外になりますので。

ただし、シリアライズはできても、デシリアライズをしたときには、@Transient指定したフィールドはnullになるので、想定していることはできないかもしれません。

投稿2022/04/19 09:27

shiketa

総合スコア3971

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Create12c

2022/04/20 01:17

ご回答ありがとうございます! 「Transient」を試したところ前述のエラーは出なくなりました。 しかし仰る通りのことが起きました。 SetNotificationが受け取っているはずのmainAvtivityがnullになっていてエラーとなりました。。。
shiketa

2022/04/20 02:15

SetNotificationをそのままシリアライズするのではなく、保存が必要な情報(かつSerializableなもの)に絞り込んだクラスを用意して、シリアライズの対象とすればよいのではないでしょうか。 あなたが参考にしたこちらのページも最終的にはそうしているとおもいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問