2012-03-30 2 views
3

Я работаю над виджетами, которые состоят из кнопки. При нажатии, я хотел бы, чтобы он запускал деятельность, не открывая ничего (просто говоря на рабочем столе, как обычно). Есть ли способ прямого запуска активности с помощью нажатия кнопки на рабочем столе? Благодаря! UPDATE: теперь я пытаюсь переключить тихий режим из кода, не запуская новое действие. Вот мой текущий код (кнопки ничего не делать, когда я нажимаю их по какой-то причине)Как запустить действие с помощью кнопки на виджетах в Android?

package toggleHD.widget; 

import android.app.Activity; 
import android.app.IntentService; 
import android.app.Notification; 
import android.app.NotificationManager; 
import android.app.PendingIntent; 
import android.media.AudioManager; 
import android.appwidget.AppWidgetManager; 
import android.appwidget.AppWidgetProvider; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 
import android.widget.RemoteViews; 
import android.widget.Toast; 


    public class ButtonWidget 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, ButtonWidget.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.main); 
      Intent active = new Intent(paramContext, ButtonWidget.class); 
      active.setAction(ACTION_WIDGET_CLICK_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, TestReceiver.class); 
configIntent.setAction(ACTION_WIDGET_CLICK_RECEIVER); 
PendingIntent configPendingIntent = PendingIntent.getActivity(paramContext, 0, configIntent, 0); 
      if(paramString.equals(ACTION_WIDGET_CLICK_RECEIVER)) 
      { 

       //open Activity here.. 
      //your code for update and what you want on button click 
// 
     rview.setOnClickPendingIntent(R.id.button_one, configPendingIntent); 
      } 
      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(); 
     } 

    } 
+0

на виджетах на главном экране Нажмите u, чтобы начать свою деятельность? –

+0

Да. Но я не хочу, чтобы он открывал полноэкранную страницу или что-то еще, просто активность. – MattDementous

+0

Активность, как правило, полноэкранная, если вы не поделитесь ею с темой диалога или подобным – Martyn

ответ

7

начало деятельности на главном экране виджетов нажмите:

Метод 1: в на onReceive

Intent intentClick = the new Intent to (context, update, class); 
PendingIntent pendingIntent = PendingIntent.getActivity (context, 0, 
intentClick, 0); 
rv.setOnClickPendingIntent (R.id.layout, pendingIntent); 

Способ 2: в onReceive

Intent intn = new Intent (context, update. Class); 
intn.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK); 
context.startActivity (intn); 

, но вы должны зарегистрировать трансляцию для виджета, нажав

+0

И что делать, если у меня есть рабочие кнопки на моем виджете. Как мне реализовать это с ними? – MattDementous

+0

см. Мой ответ: [начать действие при щелчке моего виджета?] (Http://stackoverflow.com/questions/9671596/how-do-i-start-an-activity-when-my-widget-is-clicked/9681914 # 9681914) –

+0

И как мне сказать, какую деятельность нужно запускать специально? (используя ваше сообщение, с которым вы связались) – MattDementous

1

Если вы хотите сделать sth. в фоновом режиме вы можете использовать Службу вместо Деятельности: http://developer.android.com/reference/android/app/Service.html

1.Вы можете starService сразу же после запуска приложения или отображения вашего виджета. http://developer.android.com/reference/android/content/Context.html#startService(android.content.Intent)

2.Try к bindService когда Widge щелкают http://developer.android.com/reference/android/content/Context.html#bindService(android.content.Intent, android.content.ServiceConnection, Int)

3.after переплетены, вы можете получить экземпляр службы из связующего с использованием serviceConnection. Затем вы можете выполнить код, определенный в службе. увидеть пример здесь: http://escrow.aliexpress.com //developer.android.com/reference/android/app/Service.html

или вы можете просто

  1. попытки начать службу (только на экземпляре службы будет быть запущенными в каждый момент)

  2. отправьте широковещательную рассылку на услугу, которая просит службу сделать что-л. для тебя.

Поскольку деятельность предназначена для отображения данных пользователю, а служба предназначена для выполнения в фоновом режиме.

Смежные вопросы