如何通过单击android studio中的主屏幕小部件来显示Toast消息?

时间:2017-06-06 04:15:54

标签: java android

请告诉我我做错了什么

NewAppWidget.java class

package com.example.kinjolnath.alert;

import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.RemoteViews;

/**
 * Implementation of App Widget functionality.
 */

public class NewAppWidget extends AppWidgetProvider {
    private static final String TAG = NewAppWidget.class.getSimpleName();

void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
                            int appWidgetId) {
    Log.d(TAG, "Inside updateAppWidget");
    Log.i(TAG, "Inside updateAppWidget");
    Log.e(TAG, "Inside updateAppWidget");


//        Toast.makeText(context,
//                "Should appear at widget click", Toast.LENGTH_SHORT).show();

    // Construct the RemoteViews object
    Intent intent = new Intent(context, MapsActivity.class);

    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
            intent,PendingIntent.FLAG_UPDATE_CURRENT);

    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.new_app_widget);

    views.setOnClickPendingIntent(R.id.imageButton, pendingIntent);
    Intent sendingIntent = new Intent(context, SendingService.class);
    sendingIntent.setAction(SendingService.ACTION_SEND_MESSAGE);
    PendingIntent sendingPendingIntent = PendingIntent.getService(context, 0, sendingIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    views.setOnClickPendingIntent(R.id.imageButton, sendingPendingIntent);
    // Instruct the widget manager to update the widget
    appWidgetManager.updateAppWidget(appWidgetId, views);
}


@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    // There may be multiple widgets active, so update all of them
    Log.d(TAG, "Inside onUpdate");
    Log.i(TAG, "Inside onUpdate");
    Log.e(TAG, "Inside onUpdate");
    SendingService.startActionSendMessage(context);
    for (int appWidgetId : appWidgetIds) {
        updateAppWidget(context, appWidgetManager, appWidgetId);
    }
}

@Override
public void onEnabled(Context context) {
    // Enter relevant functionality for when the first widget is created
    Log.d(TAG, "Inside onEnabled");
    Log.i(TAG, "Inside onEnabled");
    Log.e(TAG, "Inside onEnabled");
}

@Override
public void onDisabled(Context context) {
    // Enter relevant functionality for when the last widget is disabled
    Log.d(TAG, "Inside onDisabled");
    Log.i(TAG, "Inside onDisabled");
    Log.e(TAG, "Inside onDisabled");
    }
}

SendingService.java类

package com.example.kinjolnath.alert;

import android.app.IntentService;
import android.content.Context;
import android.content.Intent;
import android.support.annotation.Nullable;
import android.util.Log;
import android.widget.Toast;

/**
 * Created by kinjolnath on 01-06-2017.
 */

public class SendingService extends IntentService{
    private static final String TAG = NewAppWidget.class.getSimpleName();
    /**
     * Creates an IntentService.  Invoked by your subclass's constructor.
     *
 * @param name Used to name the worker thread, important only for debugging.
 */
public static final String ACTION_SEND_MESSAGE = "com.example.MapsActivity.action.send_message";

public SendingService(String name) {
    super(name);
}

public static void startActionSendMessage(Context context){
    Intent intent = new Intent(context, SendingService.class);
    intent.setAction(ACTION_SEND_MESSAGE);
    context.startService(intent);
    Log.d(TAG, "Inside startActionSendMessage");
    Log.i(TAG, "Inside startActionSendMessage");
    Log.e(TAG, "Inside startActionSendMessage");
}

@Override
protected void onHandleIntent(@Nullable Intent intent) {
    if (intent != null){
        final String action = intent.getAction();
        Log.d(TAG, action + "inside onHandleIntent");
        if(ACTION_SEND_MESSAGE.equals(action)){
            handleActionSend();
        }
    }
}
//handleActionSend method:
private void handleActionSend() {
    Toast.makeText(this, "Message sent", Toast.LENGTH_SHORT).show();
    Log.d(TAG, "Inside handleActionSend");
    Log.i(TAG, "Inside handleActionSend");
    Log.e(TAG, "Inside handleActionSend");
    }
}

我遵循了Udacity的教程,最终在这个阶段结束了,但它仍然无法正常工作 我是Android开发的新手,所以任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:0)

您无法在点击WidGet时显示Toast,因为小部件扩展了 AppWidgetProvider ,因此该类无法调用当前上下文

如果您想通过使用以下代码创建窗口小部件或选择窗口小部件来显示Toast:

Handler handler = new Handler(Looper.getMainLooper());
        handler.post(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(context,"hiii dhruv", Toast.LENGTH_LONG).show();
            }
        });

=============================================== ===========================

如何在窗口小部件类中使用上面的代码

@Override
    public void onUpdate(final Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        super.onUpdate(context, appWidgetManager, appWidgetIds);
        Handler handler = new Handler(Looper.getMainLooper());
        handler.post(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(context,"hiii dhruv", Toast.LENGTH_LONG).show();
            }
        });

    }

=============================================== =====================

 @Override
    public void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);
        Toast.makeText(context, "hiiiiiiiiiiii", Toast.LENGTH_SHORT).show();
    }

答案 1 :(得分:-1)

请参阅:Android: Toast in a thread

如果toast没有显示,则可能没有使用UI线程。您可以尝试使用applicationContext而不是这个,但我不确定它是否有效。我不喜欢在UI不可见的情况下运行Toasts但是已经运行这个以用于特定测试,而不必查看日志。