Я создал виджет, который состоит из 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>