Невозможно отменить мой сервис AlarmManager на виджете - PullRequest
1 голос
/ 03 февраля 2012

Я создал виджет, который состоит из 2 макетов.Один имеет только одну кнопку «Войти».Когда пользователь щелкнул по нему, активность началась для входа. При успешном входе макет виджета изменяется в зависимости от цели вещания, и у этого макета есть 2 кнопки, и я установил AlarmManager для автоматического многократного обновления, одна кнопка предназначена для обновления, когда пользователь нажимает на нее.,Обновление виджета и новые значения появляются на макете, а вторая кнопка предназначена для выхода из системы, и я хочу отменить этот AlarmManager на setOnClickListener.

Резюме: я не могу отменить свою службу AlarmManager на виджете, пожалуйстапожалуйста, помогите мне из этого

Код активности:

package widget.src;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class POPWidgetActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // setContentView(R.layout.widget);
        //WidgetLogOut();
        Toast.makeText(this, "Welcome to My Activity", Toast.LENGTH_LONG)
                .show();
        setContentView(R.layout.activity_login);

        Button sign_in = (Button)findViewById(R.id.sign_in);
        Button sign_out = (Button)findViewById(R.id.sign_out);

        sign_in.setOnClickListener(login);
        sign_out.setOnClickListener(logout);
    }
    View.OnClickListener login = new View.OnClickListener(){
        public void onClick(View v){
            Toast.makeText(POPWidgetActivity.this, "Login clicked", Toast.LENGTH_LONG);
            WidgetLogIn();
        }
    };  
    View.OnClickListener logout = new View.OnClickListener(){
        public void onClick(View v){
            Toast.makeText(POPWidgetActivity.this, "Logout clicked", Toast.LENGTH_LONG);
            WidgetLogOut();
        }
    };  
    private void WidgetLogOut() {
        Intent i = new Intent(this, AppWidget.class);
        i.setAction("log_out");
        sendBroadcast(i);
    }
    private void WidgetLogIn() {
        Intent i = new Intent(this, AppWidget.class);
        i.setAction("log_in");
        //i.setAction("");
        sendBroadcast(i);
    }
}

Код виджета

    package widget.src;

import java.util.Calendar;

import widget.src.POPWidgetActivity;
import widget.src.R;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.util.Log;
import android.widget.RemoteViews;
import android.widget.Toast;

public class AppWidget extends AppWidgetProvider 
{
    public static String LOG_OUT = "log_out";
    public static String LOG_IN = "log_in";
    public static boolean logged_in = false;
    public AlarmManager alarmManager = null;

    public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) 
    {
        android.os.Debug.waitForDebugger();  // this line is key

        Toast.makeText(context, "onUpdate", Toast.LENGTH_SHORT).show();

        RemoteViews views;

        //Defining Layout of the widget

        if (AppWidget.logged_in) 
        {
            views = new RemoteViews(context.getPackageName(), R.layout.widget);

            // Logout Button

            ComponentName com_logout = new ComponentName(context,AppWidget.class);

            appWidgetManager.updateAppWidget(com_logout,Logout(context, appWidgetIds));

            // Search Button

            Intent search_intent = new Intent(context, POPWidgetActivity.class);

            PendingIntent search_pendingIntent = PendingIntent.getActivity(context, 0, search_intent, 0);

            views.setOnClickPendingIntent(R.id.search, search_pendingIntent);

            // Refresh call

            ComponentName com_refresh = new ComponentName(context,AppWidget.class);

            appWidgetManager.updateAppWidget(com_refresh,buildUpdate(context, appWidgetIds));

            // Alarm Call

            if (alarmManager == null) 
            {

                alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

                Calendar calendar = Calendar.getInstance();

                calendar.setTimeInMillis(System.currentTimeMillis());

                calendar.add(Calendar.SECOND, 5);

                Intent intent = new Intent(context, AppWidget.class);

                intent.setData((Uri.parse("123")));

                intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);

                intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);

                PendingIntent pendingIntent = PendingIntent.getActivity(context, 123, intent,PendingIntent.FLAG_CANCEL_CURRENT);

                alarmManager.set(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(), pendingIntent);

                PendingIntent pi = PendingIntent.getBroadcast(context, 123, intent,PendingIntent.FLAG_UPDATE_CURRENT);

                alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(), 10 * 1000, pi);

                Toast.makeText(context, "SND Refresh Rate : 5 seconds",Toast.LENGTH_LONG).show();
            }
        } else 
        {
            views = new RemoteViews(context.getPackageName(),R.layout.widget_logout);

            Intent intent = new Intent(context, POPWidgetActivity.class);

            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,intent, 0);

            views.setOnClickPendingIntent(R.id.login, pendingIntent);

            views.setOnClickPendingIntent(R.id.search, pendingIntent);
        }

        Log.println(Log.INFO, "appWidgetIds ", "");

        appWidgetManager.updateAppWidget(appWidgetIds, views);

    }

    public RemoteViews Logout(Context ctxt, int[] appWidgetIds) 
    {

        RemoteViews updateViews = new RemoteViews(ctxt.getPackageName(),R.layout.widget);

        Intent i = new Intent(ctxt, AppWidget.class);

        i.setData((Uri.parse("123")));

        i.setAction(LOG_OUT);

        i.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);

        PendingIntent pi = PendingIntent.getBroadcast(ctxt, 123, i,PendingIntent.FLAG_CANCEL_CURRENT);

        updateViews.setOnClickPendingIntent(R.id.logout, pi);

        if (!logged_in)
            logged_in = true;

        return (updateViews);
    }

    @Override
    public void onEnabled(Context context) 
    {
        Toast.makeText(context, "onEnabled", Toast.LENGTH_SHORT).show();

        // Defining Layout of the widget
        RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.widget_logout);

        Intent intent = new Intent(context, POPWidgetActivity.class);

        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,intent, 0);

        views.setOnClickPendingIntent(R.id.login, pendingIntent);

        Log.println(Log.INFO, "appWidgetIds ", "");

        AppWidgetManager.getInstance(context).updateAppWidget(new ComponentName(context, AppWidget.class), views);

        super.onEnabled(context);
    }

    private RemoteViews buildUpdate(Context ctxt, int[] appWidgetIds) 
    {

        RemoteViews updateViews = new RemoteViews(ctxt.getPackageName(),R.layout.widget);

        Intent i = new Intent(ctxt, AppWidget.class);

        i.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);

        i.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);

        PendingIntent pi = PendingIntent.getBroadcast(ctxt, 0, i,PendingIntent.FLAG_UPDATE_CURRENT);

        updateViews.setTextViewText(R.id.planned_value,(int) (Math.random() * 6) + "");

        updateViews.setOnClickPendingIntent(R.id.refresh, pi);

        return (updateViews);
    }

    @Override
    public void onReceive(Context context, Intent intent) 
    {

        Toast.makeText(context, "onReceive", Toast.LENGTH_SHORT).show();

        String action = intent.getAction();

        final AppWidgetManager manager = AppWidgetManager.getInstance(context);

        if (action != null && action.equals(LOG_OUT)) 
        {
            Toast.makeText(context, "Request for Log out", Toast.LENGTH_SHORT).show();

            AppWidget.logged_in = false;

            AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

            Intent updateServiceIntent = new Intent(context, AppWidget.class);

            updateServiceIntent.setData((Uri.parse("123")));

            PendingIntent pendingUpdateIntent = PendingIntent.getService(context, 123, updateServiceIntent,PendingIntent.FLAG_CANCEL_CURRENT);

            // Cancel alarms
            try 
            {
                alarmManager.cancel(pendingUpdateIntent);

                Toast.makeText(context, "Cancel Alarm Successfully.",Toast.LENGTH_SHORT).show();

            } catch (Exception e) {

                Toast.makeText(context, "Unable to cancel Alarm.",Toast.LENGTH_SHORT).show();

            }

            onUpdate(context, manager,manager.getAppWidgetIds(new ComponentName(context,AppWidget.class)));

        } else if (action != null && action.equals(LOG_IN)) {

            Toast.makeText(context, "Request for Log In", Toast.LENGTH_SHORT).show();

            AppWidget.logged_in = true;

            onUpdate(context, manager,manager.getAppWidgetIds(new ComponentName(context,AppWidget.class)));

        } else {

            super.onReceive(context, intent);

        }

    }

}

Манифест

    <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="widget.src" android:versionCode="1" android:versionName="1.0">
    <!-- <supports-screens android:largeScreens="true" android:normalScreens="true" 
        android:smallScreens="false" /> -->

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".POPWidgetActivity" android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!-- Widget Rules -->

        <receiver android:name=".AppWidget" android:icon="@drawable/widget_icon">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>
            <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_provider" />
        </receiver>

        <!-- <service android:name=".AppWidget" /> -->
    </application>
    <uses-sdk android:minSdkVersion="10" />
</manifest>

1 Ответ

0 голосов
/ 22 июня 2012

В Intent.setData (Uri uri) вы должны передать точно такой же экземпляр класса Uri.

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

Более подробное объяснение здесь:

http://malubu.wordpress.com/2012/06/05/take-your-time-widgets-and-alarmmanager

Найдите MaLuBuTestWidget.addUri ()

То же самое здесь:

Не удается остановить службу, запущенную с alarmManager

...