Widget小组件点击不跳转

648 阅读1分钟

项目中的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,问题解决。