2017-06-06 68 views
-2

请告诉我什么,我做错了如何通过单击android studio中的主屏幕小部件来显示敬酒消息?

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开发很陌生,所以不胜感激。

+0

是你的日志,到处工作?也就是说,“Toast”是唯一不起作用的东西? –

+1

吐司评论你的代码。 –

+0

@MikeM。 handleActionSend中的日志不起作用 – kinjol

回答

0

因为小部件延伸的AppWidgetProvider,这样的类不能给你打电话不能显示小窗口的点击吐司当前上下文

如果你想显示敬酒时创建控件或选择小部件可以通过使用波纹管代码:

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

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

如何在您的widget类中使用以上代码

@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(); 
    } 
+0

您提供的链接帮助了很多。我在onRecieve方法上做了重写,现在它可以工作。谢谢 – kinjol

+0

@kinjol是的,你是对的,如果你喜欢我的代码,那么请正确标记它 谢谢 –

-1

请看到这一点:Android: Toast in a thread

如果面包没有显示那么它很可能不使用UI线程。你可以尝试使用applicationContext而不是这个,尽管我不确定这会起作用。我不喜欢在用户界面不可见时运行Toasts,但已经运行这个用于特定测试而无需查看日志。