项目中的widget要实现动画效果。通过不断更新widget的imageView能够实现。具体思路可以参考github.com/sanatani9/m…
在动画实现过程中,出现了一个case:点击widget上的控件无法进行跳转了。同时log输出以下日志:
android.content.IntentSender$SendIntentException
at android.app.Activity.startIntentSenderForResultInner(Activity.java:6024)
at android.app.Activity.startIntentSenderForResult(Activity.java:5989)
at androidx.activity.ComponentActivity.startIntentSenderForResult(ComponentActivity.java:631)
at android.app.Activity.startIntentSender(Activity.java:6187)
at com.miui.home.launcher.Launcher.startIntentSender(Launcher.java:10123)
at android.content.ContextWrapper.startIntentSender(ContextWrapper.java:504)
at android.widget.RemoteViews.startPendingIntent(RemoteViews.java:6718)
at android.appwidget.AppWidgetHostView.lambda$getHandler$1$android-appwidget-AppWidgetHostView(AppWidgetHostView.java:904)
at android.appwidget.AppWidgetHostView$$ExternalSyntheticLambda0.onInteraction(Unknown Source:4)
at android.widget.RemoteViews$RemoteResponse.handleViewInteraction(RemoteViews.java:6622)
at android.widget.RemoteViews$RemoteResponse.-$$Nest$mhandleViewInteraction(Unknown Source:0)
at android.widget.RemoteViews$SetOnClickResponse.lambda$apply$0$android-widget-RemoteViews$SetOnClickResponse(RemoteViews.java:1218)
at android.widget.RemoteViews$SetOnClickResponse$$ExternalSyntheticLambda0.onClick(Unknown Source:4)
at android.view.View.performClick(View.java:7560)
at android.view.View.performClickInternal(View.java:7533)
at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0)
at android.view.View$PerformClick.run(View.java:29754)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:210)
at android.os.Looper.loop(Looper.java:299)
at android.app.ActivityThread.main(ActivityThread.java:8136)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:580)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1028)
这个问题我在网上找了一下,有一个老哥有一段代码分析:
frameworks/base/core/java/android/app/ContextImpl.java startIntentSender
int result = ActivityManagerNative.getDefault()
.startActivityIntentSender(mMainThread.getApplicationThread(), intent,
fillInIntent, resolvedType, null, null,
0, flagsMask, flagsValues);
if (result == IActivityManager.START_CANCELED) {
throw new IntentSender.SendIntentException();
}
frameworks/base/core/java/android/app/ActivityManagerNative.java startActivityIntentSender
我猜测与下面api中的flags有关系,当前在创建PendingIntent的时候使用的是PendingIntent.FLAG_CANCEL_CURRENT,这个flag的意思是:当系统中存在一个PendingIntent的时候,在创建新的相同PendingIntent之前,当前存在的PendingIntent会失效,使用新建的PendingIntent替代原来存在的PendingIntent。如果只是更新了extraData,可以使用PendingIntent.FLAG_UPDATE_CURRENT,这个flag的意思是:当新建的PendingIntent与存在的PendingIntent相同,仅仅extraData不同时,还是会使用原来的PendingIntent,但是会更新原来PendingIntent中的extra数据。
PendingIntent.getActivity(context, requestCode, intent, flags)
根据当前场景,将flag更换为PendingIntent,问题解决。