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

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

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

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

Android

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

Android Studio

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

Kotlin

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

解決済

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

Create12c
Create12c

総合スコア52

Java

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

Android

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

Android Studio

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

Kotlin

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

2回答

0グッド

0クリップ

671閲覧

投稿2022/04/19 08:43

編集2022/04/19 08:53

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

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

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

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

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答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

総合スコア3679

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

Create12c

2022/04/20 01:17

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

2022/04/20 02:15

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Java

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

Android

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

Android Studio

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

Kotlin

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