PendingIntent无法转为字节,存储数据库

本文深入探讨了Android中PendingIntent的使用限制,指出其虽然实现了Parcelable接口,但因内部Binder机制,实际上无法转换为字节存储于数据库。文章强调PendingIntent仅适用于临时存储,避免后续开发者误用。

                  

1,PendingIntent,实现了Parcelable接口,理论上可以以字节的形式存储数据库,但实际上不能如此,android也不允许我们去将他转成字节存储,因其内部binder了其他类,在转换为字节时会报异常,有兴趣的同学可以研究源码!

2,总结,无法转为字节,无法存储数据库,只能临时存储,只希望后来的同学少走弯路!

PendingIntentAndroid 中的一个重要概念,它是一个对 Intent 的描述,可将该描述交给其他程序,使其他程序在未来的某个时间执行安排好的操作。与普通 Intent 不同,普通 Intent 表示当前想要执行的操作,可在 Activity 中立即执行;而 PendingIntent 对 Intent 进行了包装,不一定马上执行,可传递给其他 Activity 或应用程序,获取到 PendingIntent 的应用程序能根据其中的 Intent 了解发出者的意图,并选择拦截、继续传递或执行 [^2]。 使用 PendingIntent 时,需使用其静态方法(如 `getActivity()`、`getService()`、`getBroadcast()`)创建对象,这些方法会返回一个 PendingIntent 对象,用于描述将来要执行的操作 [^1]。同时,创建 PendingIntent 时可设置不同的 Flags 类型,具体如下: - `FLAG_ONE_SHOT`:得到的 PendingIntent 只能使用一次,第二次使用时会报错。 - `FLAG_NO_CREATE`:当 PendingIntent在时,不创建,返回 null。 - `FLAG_CANCEL_CURRENT`:每次都创建一个新的 PendingIntent。 - `FLAG_UPDATE_CURRENT`:不在时就创建,创建好后一直使用,每次使用时都会更新 PendingIntent 的数据(使用较多) [^3]。 以下是 PendingIntent 在不同场景下的使用示例: #### 在 AlarmManager 中的使用 ```java import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; // ... Intent intent = new Intent("action", null, context, serviceClass); PendingIntent pi = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); manager.set(AlarmManager.RTC_WAKEUP, milis, pi); ``` #### 在 NotificationManager 中的使用 ```java import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; // ... Intent intent = new Intent(); intent.setAction("myaction"); PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); Notification n = new Notification(); n.icon = R.drawable.ic_launcher; n.when = System.currentTimeMillis(); n.setLatestEventInfo(this, "this is title", "this is a message", pi); nm.notify(0, n); ``` PendingIntent 的应用场景广泛,常见的有: - **定时任务**:结合 `AlarmManager` 实现定时提醒、定时执行服务等功能。 - **通知栏消息**:在通知栏消息中设置点击后的操作,如点击通知栏消息打开特定的 Activity 或执行广播等。 - **远程服务调用**:将 PendingIntent 传递给其他应用或系统服务,让其在合适的时机执行特定操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值