0

Update: решаемый его раствор нижеAndroid Widget OnClick не работает - служба не запускается

Я пытаюсь написать виджет, который запускает услугу, которая затем будет делать некоторые вещи еще не реализован. Пока что моя услуга такова:

public class SmartWifiService extends Service { 

private static final String WIDGET_CLICK = "de.regenhardt.smartwifiwidget.WIDGET_CLICK"; 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    super.onStartCommand(intent, flags, startId); 
    Log.e("DEBUG", "Service started"); 
    Toast.makeText(getApplicationContext(), "Widget clicked", Toast.LENGTH_SHORT).show(); 
    stopSelf(); 
    return START_NOT_STICKY; 
} 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 
} 

Итак, все, что он делает, отправляет тост и останавливается после этого.

К сожалению, к этому не приходит. Мой провайдер выглядит следующим образом:

public class SmartWifiWidgetProvider extends AppWidgetProvider { 
@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
    Log.e("DEBUG", "onUpdate called"); 
    super.onUpdate(context, appWidgetManager, appWidgetIds); 
    Intent clickIntent = new Intent(context, SmartWifiWidgetProvider.class); 
    clickIntent.setAction("de.regenhardt.smartwifiwidget.WIDGET_CLICK"); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context.getApplicationContext(), 
      0, clickIntent, 0); 
    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout); 
    views.setOnClickPendingIntent(R.id.layout, pendingIntent); 
    //for (int ID:appWidgetIds) { 
    // views.setOnClickPendingIntent(ID, pendingIntent); 
     appWidgetManager.updateAppWidget(appWidgetIds, views); 
    //} 
    @Override 
public void onReceive(Context context, Intent intent) { 
    Log.e("DEBUG", "received"); 
    super.onReceive(context, intent); 
    if(intent.getAction().equals("de.regenhardt.smartwifiwidget.WIDGET_CLICK")){ 
     Log.e("DEBUG", "Click action fits"); 
     Intent i = new Intent(context.getApplicationContext(), SmartWifiService.class); 
     context.startService(i); 
    } 
} 
} 

Я прошел через несколько отвеченных вопросов здесь, изменил вещи, добавил материал, и до сих пор ничего толком не работал, и я до сих пор понятия не имею, почему.

Когда я нажимаю на виджет нет анимации, но я уверен, что сам мой виджет кликабельна:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/layout" 
      android:clickable="true"> 
<ImageView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:src="@drawable/wifi" 
    android:clickable="true" 
    android:id="+id/widgetImage"/> 
</LinearLayout> 

Также пробовал с ImageButton, никаких изменений в силу.

Надеюсь, вы, ребята, можете мне помочь, я сижу в этой маленькой вещи в течение многих дней, и моя голова вращается (не буквально).

Привет,

Marlon

Edit: Вот мой Manifest:

<application android:allowBackup="true" 
      android:label="@string/app_name" 
      android:icon="@drawable/wifi" 
      android:theme="@style/AppTheme"> 
    <receiver android:name=".SmartWifiWidgetProvider"> 
     <intent-filter> 
      <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/> 
      <action android:name="de.regenhardt.smartwifiwidget.WIDGET_CLICK"/> 
     </intent-filter> 
     <meta-data android:name="android.appwidget.provider" 
        android:resource="@xml/smart_wifi_widget_info"/> 
    </receiver> 
    <service android:name="de.regenhardt.smartwifiwidget.SmartWifiService"/> 

</application> 

Edit 2: Update; обновлено до текущего состояния моего кода, адаптировано к Y.S. ' ответ.

LogCat после добавления виджета, нажав на него до сих пор ничего не делает:

04-08 20:12:30.985 14867-14867/de.regenhardt.smartwifiwidget E/DEBUG﹕ received 
04-08 20:12:30.998 14867-14867/de.regenhardt.smartwifiwidget E/DEBUG﹕ received 
04-08 20:12:30.998 14867-14867/de.regenhardt.smartwifiwidget E/DEBUG﹕ onUpdate called 
04-08 20:12:31.155 14867-14867/de.regenhardt.smartwifiwidget E/DEBUG﹕ received 

Решение:

Выдувная линия была views.setOnClickPendingIntent(R.id.widgetImage, pendingIntent);, я имел R.id.layout вместо widgetImage там. Кажется, что виджет не передает клик по ссылкам ниже, если он не обрабатывается.

+0

Вы видели мой ответ? –

+0

Да, я ел, а потом нужно время, чтобы попробовать ;-) – Squirrelkiller

ответ

3

Проблема:

Чтобы начать Service таким образом, вы должны использовать PendingIntent.getBroadcast(), не PendingIntent.getService(). И действие WIDGET_CLICK должно быть указано в манифесте приложения под тегом receiver, а не тегом service.

ШАГ 1:

Заменить

Intent clickIntent = new Intent("de.regenhardt.smartwifiwidget.WIDGET_CLICK"); 

с

Intent clickIntent = new Intent(context, SmartWifiWidgetProvider.class); 
clickIntent.setAction("de.regenhardt.smartwifiwidget.WIDGET_CLICK"); 

ШАГ 2:

Заменить

PendingIntent pendingIntent = PendingIntent.getService(context.getApplicationContext(), 
     0, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

с

PendingIntent pendingIntent = PendingIntent.getBroadcast(context.getApplicationContext(), 
     0, clickIntent, 0); 

ШАГ 3:

В манифесте, добавьте действие к receiver тег и удалите его из service тега:

<application android:allowBackup="true" 
    android:label="@string/app_name" 
    android:icon="@drawable/wifi" 
    android:theme="@style/AppTheme"> 

    <receiver android:name=".SmartWifiWidgetProvider"> 
     <intent-filter> 
      <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/> 
      <action android:name="de.regenhardt.smartwifiwidget.WIDGET_CLICK"/> 
     </intent-filter> 
     <meta-data android:name="android.appwidget.provider" 
        android:resource="@xml/smart_wifi_widget_info"/> 
    </receiver> 

    <service android:name="de.regenhardt.smartwifiwidget.SmartWifiService"></service> 

</application> 

ШАГ 4:

Установите PendingIntent на RemoteViews в виджете:

RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout); 
views.setOnClickPendingIntent(R.id.widgetImage, pendingIntent); 

ШАГ 5:

Override onReceive() метод SmartWifiWidgetProvider класса:

@Override 
public void onReceive(Context context, Intent intent) { 
    super.onReceive(context, intent); 
    if (intent.getAction().equals("de.regenhardt.smartwifiwidget.WIDGET_CLICK")) { 
     Intent i = new Intent(context.getApplicationContext(), SmartWifiService.class) 
     startService(i); 
    } 
} 

Попробуйте это. Это должно правильно начать Service.

+0

Спасибо за проработку, надеюсь, что я получу что-то вроде этого :) К сожалению, пока это не работает, но мне также пришлось внести некоторые изменения: 'R.id.layout' - это идентификатор моего LinearLayout, окружающий ImageView, я надеюсь, что вычитал это право. startService не будет распознан, поэтому я сделал его context.startService. Вместо цикла for в конце я получил 'appWidgetManager.updateAppWidget (appWidgetIds, views);' – Squirrelkiller

+0

Мы делаем небольшую ошибку или два где-то ... продолжайте искать его и дайте мне знать. Это не ракетостроение, просто простая логическая ошибка где-то ... :) –

+0

Я поместил команды журнала везде, возможно, это помогает увидеть что-то, обновил мой вопрос ^^ – Squirrelkiller

0

Вы должны добавить службу в манифесте:

<service android:name="SmartWifiService"></service> 

Вы не сказали, как вы вызываете службу, так что я мог бы сказать, что необходимость вызывать StartService (Intent) от некоторой деятельности - это не заводилась без этого.

+0

Добавил мой манифест, Служба уже была там. Я думал, что 'views.setOnClickPendingIntent (ID, pendingIntent);' заставит мой виджет запускать службу каждый раз, когда я нажимаю на нее? – Squirrelkiller

+0

Я не видел в вашем коде некоторого намерения для запуска службы. Он должен выглядеть как новый Intent (getApplicationContext(), SmartWifiService.class). – Ircover

+0

У меня было это, прежде чем читать и пробовать другие ответы, но это тоже не сработало. Попробовал это еще раз, добавив это к моему вопросу. – Squirrelkiller

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

  • Нет связанных вопросов^_^