Виджет не запускает сервис при нажатии - PullRequest
1 голос
/ 03 марта 2012

Я создаю виджет для своего приложения, но он отказывается работать. Этот виджет запускает действие по настройке, когда он создается, и когда вы щелкаете по нему, он должен запускать созданный мной IntentService. Но когда я нажимаю на него, он не запускает службу! Я пытался изменить это ожидающее намерение на намерение, которое запустит Google, и оно работает.

Код:

AppWidgetProvider XML

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:configure="com.eladaharon.android.lary.widget.LaryWidgetConfigurationActivity"
    android:initialLayout="@layout/widget_1x1"
    android:minHeight="72dp"
    android:minWidth="72dp"
    android:updatePeriodMillis="86400000" >

</appwidget-provider>

Манифест декларации

<activity
            android:name=".widget.LaryWidgetConfigurationActivity"
            android:configChanges="orientation|keyboard" >
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
            </intent-filter>
        </activity>

        <service android:icon="@drawable/icon" android:enabled="true" android:name="widget.LaryWidgetCheckService" />

        <!-- Broadcast Receiver that will process AppWidget updates -->
        <receiver android:name=".widget.LaryWidgetProvider" >
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
                <action android:name="android.appwidget.action.APPWIDGET_DELETED" />
                <action android:name="android.appwidget.action.APPWIDGET_ENABLED" />
                <action android:name="android.appwidget.action.APPWIDGET_DISABLED" />
            </intent-filter>

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

Класс AppWidgetProvider

public class LaryWidgetProvider extends AppWidgetProvider {
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        final int N = appWidgetIds.length;

        // Perform this loop procedure for each App Widget that belongs to this provider
        for (int i=0; i<N; i++) {
            int appWidgetId = appWidgetIds[i];

            // Create an Intent to launch service
            Intent intent = new Intent(context, LaryWidgetCheckService.class);
            intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
            PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0);

            // Get the layout for the App Widget and attach an on-click listener
            // to the button
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_1x1);
            views.setOnClickPendingIntent(R.id.widget_check_button, pendingIntent);

            // Tell the AppWidgetManager to perform an update on the current app widget
            appWidgetManager.updateAppWidget(appWidgetId, views);
        }
    }

    public void onEnabled(Context context) {
        PackageManager pm = context.getPackageManager();
        pm.setComponentEnabledSetting(
                new ComponentName("com.eladaharon.android.lary.widget",
                        ".SalaryWidgetConfigurationActivity"),
                        PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                        PackageManager.DONT_KILL_APP);
    }

    public void onDisabled(Context context) {
        PackageManager pm = context.getPackageManager();
        pm.setComponentEnabledSetting(
                new ComponentName("com.eladaharon.android.lary.widget",
                        ".LaryWidgetConfigurationActivity"),
                        PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                        PackageManager.DONT_KILL_APP);
    }

    public void onDeleted(Context context, int[] appWidgetIds)
    {
        Editor edit = context.getSharedPreferences(Constants.PREFERNCES_WIDGET_PREFERENCES, Context.MODE_PRIVATE).edit();
        final int N = appWidgetIds.length;
        for (int i=0; i<N; i++)
        {
            edit.remove(String.valueOf(appWidgetIds[i]));
        }
        edit.commit();
    }

    public static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
            int appWidgetId) {

        // Create an Intent to launch service
        Intent intent = new Intent(context, LaryWidgetCheckService.class);
        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
        PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0);

        // Get the layout for the App Widget and attach an on-click listener
        // to the button
        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_1x1);
        views.setOnClickPendingIntent(R.id.widget_check_button, pendingIntent);

        // Tell the AppWidgetManager to perform an update on the current app widget
        appWidgetManager.updateAppWidget(appWidgetId, views);
    }

}

Обработчик, который вызывается при завершении действия конфигурации

private Handler mHandler = new Handler(){

        @Override
        public void handleMessage(Message msg){
            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(LaryWidgetConfigurationActivity.this);
            LaryWidgetProvider.updateAppWidget(LaryWidgetConfigurationActivity.this, appWidgetManager,
                    mAppWidgetId);

            // Make sure we pass back the original appWidgetId
            Intent resultValue = new Intent();
            resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
            setResult(RESULT_OK, resultValue);
            finish();
        }
    };

Служба, которую я хочу запустить на клике

public class LaryWidgetCheckService extends IntentService {
    private int mAppWidgetId;

    public LaryWidgetCheckService(String name) {
        super("WorkplaceService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        Bundle extras = intent.getExtras();
        if (extras != null) {
            mAppWidgetId = extras.getInt(
                    AppWidgetManager.EXTRA_APPWIDGET_ID, 
                    AppWidgetManager.INVALID_APPWIDGET_ID);
        }

        // If they gave us an intent without the widget id, just bail.
        if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
            return;
        }

        // Running some code
    }

}

Заранее спасибо !!

Ответы [ 2 ]

4 голосов
/ 04 марта 2012

Я ненавижу этот мир !!!Если вы посмотрите еще раз в манифесте, вы заметите, что я написал widget.SERVICENAME вместо .widget.SERVICENAME !!!

Я потратил на это целый день!для всех, кто пытался помочь!

0 голосов
/ 03 марта 2012

Виджет запускается в другом процессе, и вы отправляете явное намерение, которое будет работать только внутри вашего приложения.Причина, по которой намеревается запустить страницу Google в веб-браузере, заключается в том, что это еще один тип намерения, в котором задействован приемник широковещательной передачи, и он распространяется по всей системе, чтобы узнать, отвечает ли кто-то.

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

...