如何将PendingIntent保存到SQLite数据库?

4

我使用NotificationListenerService来拦截通知并进行清除操作,同时希望能够拦截保存在数据库中的PendingIntent所对应的通知。但是由于PendingIntent没有被序列化,因此我需要获取PendingIntent内部的Intent,并使用intent.toUri()方法进行序列化并保存到数据库中。然而,在调用startActivity(intent)后,当我尝试反序列化Intent时,出现了异常:

Process: com.example.joee.cleardatademo, PID: 20441
                  java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.VIEW flg=0x14008000 cmp=com.skype.raider/com.skype.android.app.main.HubActivity (has extras) } from ProcessRecord{4596be88 20441:com.example.joee.cleardatademo/u0a1647} (pid=20441, uid=11647) not exported from uid 11028
                      at android.os.Parcel.readException(Parcel.java:1474)
                      at android.os.Parcel.readException(Parcel.java:1427)
                      at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2104)
                      at android.app.Instrumentation.execStartActivity(Instrumentation.java:1419)
                      at android.app.ContextImpl.startActivity(ContextImpl.java:1065)
                      at android.app.ContextImpl.startActivity(ContextImpl.java:1047)
                      at com.example.joee.cleardatademo.activity.NotificationManagerActivity$2$1.onClick(NotificationManagerActivity.java:110)
                      at android.view.View.performClick(View.java:4569)
                      at android.view.View$PerformClick.run(View.java:18570)
                      at android.os.Handler.handleCallback(Handler.java:733)
                      at android.os.Handler.dispatchMessage(Handler.java:95)
                      at android.os.Looper.loop(Looper.java:212)
                      at android.app.ActivityThread.main(ActivityThread.java:5151)
                      at java.lang.reflect.Method.invokeNative(Native Method)
                      at java.lang.reflect.Method.invoke(Method.java:515)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684)
                      at dalvik.system.NativeStart.main(Native Method)
I/Process: Sending signal. PID: 20441 SIG: 9
Disconnected from the target VM, address: 'localhost:8633', transport: 'socket'

如何将 PendingIntent 保存到数据库中?或者有其他方法可以实现并保存 PendingIntent 的相同效果吗?

你找到了一种将其保存到数据库并检索以启动应用程序的方法吗? - Libin
1个回答

1
我认为您误解了PendingIntent的目的。它应该用于在具有相同权限的不同应用程序中触发包含在其中的Intent,以便启动其他应用程序内部的活动。
它通过Android中的binder机制与原始目标建立连接来实现这一点。即使将PendingIntent保存到Parcel中,当您恢复PendingIntent时,它仍将与原始对象保持连接,因为它保存了连接令牌。
然而,您所做的是从PendingIntent中删除Intent并尝试启动它。它试图从原始应用程序启动活动,而您没有访问权限。不幸的是,我看不到您将PendingIntent保存到数据库的方法,因为您需要保存我提到的令牌,并且没有可靠的方法来获取它。它甚至没有存储在Java代码中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接