微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尝试为我的应用程序创建一个 Android 小部件按钮,用于打开 Java 活动,发送 URI 数据

如何解决尝试为我的应用程序创建一个 Android 小部件按钮,用于打开 Java 活动,发送 URI 数据

所以,对此有很多问题,但没有一个答案有效,我的问题是独一无二的。我正在尝试设置 URI 数据,以便我可以将其从我创建的小部件按钮以意图发送到 java 类。我知道小部件按钮设置正确,因为它会在点击时发送 toast 消息。

问题是:没有意图或意图的变化,我在点击按钮后发送,有效。它总是崩溃,并且 logcat 给出了一个主要是非描述性的原因,指向 startActivity(i)。任何帮助将非常感激。小部件的完整代码如下:

package com.matthewbenchimol.cydogbrowser;

import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.appwidgetprovider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.view.View;
import android.widget.ImageButton;
import android.widget.RemoteViews;
import android.widget.Toast;

import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
import static androidx.core.content.ContextCompat.startActivity;
import static java.security.AccessController.getContext;

/**
 * Implementation of App Widget functionality.
 */
public class Dashboard extends appwidgetprovider {

    private static final String MyOnClick = "myOnClickTag";

    void updateAppWidget(Context context,AppWidgetManager appWidgetManager,int appWidgetId) {
        // Construct the RemoteViews object
        RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.dashboard);

        Intent intent = new Intent(context,Dashboard.class);
        intent.setAction(MyOnClick);

        PendingIntent pendingIntent = PendingIntent.getbroadcast(context,intent,0);
        views.setonClickPendingIntent(R.id.imageButton,pendingIntent);

        // Instruct the widget manager to update the widget
        appWidgetManager.updateAppWidget(appWidgetId,views);
    }

    public void onReceive(Context context,Intent intent){
        super.onReceive(context,intent);
        String url = "https://test.com";
        if (intent.getAction().equals(MyOnClick)) {
            Toast.makeText(context.getApplicationContext(),"Under-development",Toast.LENGTH_SHORT).show();
            Intent i = new Intent(context,SandBox.class);
            intent.setData(Uri.parse(url));
            context.startActivity(i);
        }
    }

    @Override
    public void onUpdate(Context context,int[] appWidgetIds) {
        // There may be multiple widgets active,so update all of them
        for (int appWidgetId : appWidgetIds) {
            updateAppWidget(context,appWidgetManager,appWidgetId);
        }
    }

    @Override
    public void onEnabled(Context context) {
        // Enter relevant functionality for when the first widget is created
    }

    @Override
    public void ondisabled(Context context) {
        // Enter relevant functionality for when the last widget is disabled
    }
}

解决方法

不确定您每次点击小部件按钮时启动的广播的目的;但我认为 Uri 数据应该附加到与 PendingIntent 相关联的意图,该意图将在 onUpdate() 回调中注册到系统中。

因此,如果您只是真的想将 Uri 数据发送到 Activity 而没有特别需要广播接收器;您只需将其附加到与按钮关联的 PendingIntent 的意图。

public class Dashboard extends AppWidgetProvider {

    void updateAppWidget(Context context,AppWidgetManager appWidgetManager,int appWidgetId) {
        // Construct the RemoteViews object
        RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.dashboard);

        Intent intent = new Intent(context,Sandbox.class);
        String url = "https://test.com";
        intent.setData(Uri.parse(url));
        
        PendingIntent pendingIntent = PendingIntent.getActivity(context,intent,0);
        
        views.setOnClickPendingIntent(R.id.imageButton,pendingIntent);
    
        // Instruct the widget manager to update the widget
        appWidgetManager.updateAppWidget(appWidgetId,views);
    }

    //.... 

}

这会将 Uri 发送到活动:

public class Sandbox extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(....);  

        Intent intent = getIntent();

        if (intent != null) {
            Uri data = intent.getData(); // Should contain `https://test.com`
            Log.d("LOG_TAG","onCreate: data: " + data); 
        } else {
            Log.d("LOG_TAG","onCreate: data: Null");
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。