2012-02-03 2 views
1

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

Резюме: Я не могу отменить мою службу 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); 

     } 

    } 

} 

Manifest

<?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> 

ответ

0

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

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

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

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

Посмотрите на MaLuBuTestWidget.addUri()

Same здесь:

Can't stop a service started with alarmManager

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