单击我的Widget时如何启动活动?

时间:2012-03-12 17:12:31

标签: android android-intent android-widget

我有这个小部件可以关闭声音,但我想调用另一个活动(MYxz.class),请告诉我应该在这里更改...

  public class AppWidget extends AppWidgetProvider {

 @Override
 public void onReceive(Context ctxt, Intent intent)
 {
      if(intent.getAction()==null)
      {
          ctxt.startService(new Intent(ctxt,ToggleService.class));
      }
   else
      {
    super.onReceive(ctxt, intent);
}

}

   @Override
  public void onUpdate(Context context,AppWidgetManager appWidgetManager, int [] appWidgetIds)
  {
context.startService(new Intent(context,ToggleService.class));
//RemoteViews buildUpdate(context);
   }

  public static class ToggleService extends IntentService
   {
public ToggleService() {
    super("AppWidget$ToggleService");

    }



    @Override
    protected void onHandleIntent(Intent intent)
 {
   ComponentName me = new ComponentName(this,AppWidget.class);
  AppWidgetManager mgr= AppWidgetManager.getInstance(this);
  mgr.updateAppWidget(me,buildUpdate(this));
 }

 private RemoteViews buildUpdate(Context context)
{
RemoteViews updateViews=new RemoteViews(context.getPackageName(),R.layout.widget);
AudioManager audioManager=(AudioManager)context.getSystemService(Activity.AUDIO_SERVICE);
if(audioManager.getRingerMode()==AudioManager.RINGER_MODE_SILENT)
{
    updateViews.setImageViewResource(R.id.phoneState,R.drawable.silent);
    audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);

}
else {
    updateViews.setImageViewResource(R.id.phoneState,R.drawable.phone123);
    audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);

}
Intent i=new Intent(this, AppWidget.class);
PendingIntent pi= PendingIntent.getBroadcast(context,0, i,0);
updateViews.setOnClickPendingIntent(R.id.phoneState,pi);
return updateViews;
}

 }
}

3 个答案:

答案 0 :(得分:2)

是可能见示例:

上传您的manifest.xml

<receiver android:name=".AppWidget"
        android:label="Caller"
        android:icon="@drawable/ic_launcher" >
        <intent-filter >
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
 <action android:name="com.app.example.MyWidget.ACTION_WIDGET_CLICK_RECEIVER"/>

        </intent-filter>
        <meta-data 
            android:name="android.appwidget.provider"
            android:resource="@xml/widget_provider"
            />

    </receiver>
    <service android:name=".AppWidget$ToggleService"  />

并更新您的AppWidgetProvider

      public class MyWidget extends AppWidgetProvider {
                    public static String ACTION_WIDGET_CLICK_RECEIVER = "ActionReceiverWidget";

                    public static int appid[];
                    public static RemoteViews rview;
                    @Override
                    public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
                            int[] appWidgetIds){
                        updateWidgetState(context, ""); 
                    }
                    @Override
                    public void onReceive(Context paramContext, Intent paramIntent)
                      {
                         String str = paramIntent.getAction();
                        if (paramIntent.getAction().equals(ACTION_WIDGET_CLICK_RECEIVER)) {
                            updateWidgetState(paramContext, str);   
                        }
                        else
                        {
                                if ("android.appwidget.action.APPWIDGET_DELETED".equals(str))
                                  {
                                    int i = paramIntent.getExtras().getInt("appWidgetId", 0);
                                    if (i == 0)
                                    {

                                    }
                                    else
                                    {
                                        int[] arrayOfInt = new int[1];
                                        arrayOfInt[0] = i;
                                        onDeleted(paramContext, arrayOfInt);
                                    }
                                  }
                          super.onReceive(paramContext, paramIntent);
                        }
                      }
                     static void updateWidgetState(Context paramContext, String paramString)
                      {
                        RemoteViews localRemoteViews = buildUpdate(paramContext, paramString);
                        ComponentName localComponentName = new ComponentName(paramContext, MyWidget.class);
                        AppWidgetManager.getInstance(paramContext).updateAppWidget(localComponentName, localRemoteViews);
                      }
                     private static RemoteViews buildUpdate(Context paramContext, String paramString)
                      {
                        // Toast.makeText(paramContext, "buildUpdate() ::"+paramString, Toast.LENGTH_SHORT).show();
                        rview = new RemoteViews(paramContext.getPackageName(), R.layout.widget_layout);
                        Intent active = new Intent(paramContext, MyWidget.class);
                        active.setAction(ACTION_WIDGET_RECEIVER);

                        PendingIntent configPendingIntent = PendingIntent.getActivity(paramContext, 0, active, 0);

        // upadte this R.id.buttonus1 with your layout or image id on which click you want to start Activity

    Intent configIntent = new Intent(paramContext, Caller2.class);
     configIntent.setAction((ACTION_WIDGET_CLICK_RECEIVER);
     PendingIntent configPendingIntent = PendingIntent.getActivity(paramContext, 0, configIntent, 0);
rview.setOnClickPendingIntent(R.id.Phonestatexx, configPendingIntent);
                        if(parmString.equals(ACTION_WIDGET_CLICK_RECEIVER))
                        {

                           //open Activity here..
                         //your code for update and what you want on button click
            //

                        }  
                         return rview; 
                      }
                    @Override
                    public void onEnabled(Context context){
                        super.onEnabled(context);
                       // Toast.makeText(context, "onEnabled()  ", Toast.LENGTH_SHORT).show();
                    }
                    // Called each time an instance of the App Widget is removed from the host
                    @Override
                    public void onDeleted(Context context, int [] appWidgetId){
                        super.onDeleted(context, appWidgetId);
                       // Toast.makeText(context, "onDeleted()  ", Toast.LENGTH_SHORT).show();
                    }
                    // Called when last instance of App Widget is deleted from the App Widget host.
                    @Override
                    public void onDisabled(Context context) {
                        super.onDisabled(context);
                       // Toast.makeText(context, "onDisabled()  ", Toast.LENGTH_SHORT).show();
                    }

                }

答案 1 :(得分:1)

使用pendingIntents时,您可以在单击窗口小部件项目时调用intent(对您的活动或其他)。这可能有所帮助: http://www.vogella.de/articles/AndroidWidgets/article.html

答案 2 :(得分:1)

而不是:

Intent active = new Intent(paramContext, AppWidget.class);

您使用:

Intent active = new Intent(paramContext, YOURCLASS.class); 

在创建待定意图之前,@ imran khan帮助了我,但是你应该做一些调整2 ...这应该会启动你需要的Activity