如何在另一个活动中停止/取消闹钟管理器?

7
我可以帮您翻译成中文。以下是需要翻译的内容:

我正在Activity A中创建警报,并在另一个Activity B中停止/取消。我尝试了很多次,但没有成功,以下是我的代码:

MainActivity

public class MainActivity extends Activity 
{

    private PendingIntent pendingIntent;
    private static Context context;

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Intent myIntent = new Intent(this, MyReceiver.class);
    pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, myIntent,0);

    AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 12 * 60 * 60, pendingIntent); 

    } //end onCreate

}

MyReceiver

    public class MyReceiver extends BroadcastReceiver
    {

        @Override
         public void onReceive(Context context, Intent intent)
        {
           Intent service1 = new Intent(context, MyAlarmService.class);
           context.startService(service1);

         }

    }

MyAlarmService

public class MyAlarmService extends Service 

{
     private NotificationManager mManager;

     @Override
     public IBinder onBind(Intent arg0)
     {
       // TODO Auto-generated method stub
        return null;
     }

    @Override
    public void onCreate() 
    {
       // TODO Auto-generated method stub  
       super.onCreate();
    }

   @SuppressWarnings("static-access")
   @Override
   public void onStart(Intent intent, int startId)
   {
       super.onStart(intent, startId);

       mManager = (NotificationManager) this.getApplicationContext().getSystemService(this.getApplicationContext().NOTIFICATION_SERVICE);
       Intent intent1 = new Intent(this.getApplicationContext(),MainActivity.class);

       Notification notification = new Notification(R.drawable.ic_launcher,"This is a test message!", System.currentTimeMillis());

       intent1.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP| Intent.FLAG_ACTIVITY_CLEAR_TOP);

       PendingIntent pendingNotificationIntent = PendingIntent.getActivity( this.getApplicationContext(),0, intent1,PendingIntent.FLAG_UPDATE_CURRENT);
       notification.flags |= Notification.FLAG_AUTO_CANCEL;
       notification.setLatestEventInfo(this.getApplicationContext(), "AlarmManagerDemo", "This is a test message!", pendingNotificationIntent);

       mManager.notify(0, notification);
    }

    @Override
    public void onDestroy() 
    {
        // TODO Auto-generated method stub
        super.onDestroy();
    }

}

下一个活动

public class NextActivity extends Activity
{

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

           Intent intentt = new Intent(this, MyReceiver.class);
           PendingIntent pintent = PendingIntent.getBroadcast(this, 10, intentt, 0);
           AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
           stopService(intentt);
           alarm.cancel(pintent);
    }   
}

清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="10" />


    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:name="com.example.NextActivity"
            android:label="Next Screen">
        </activity>

        <service android:name=".MyAlarmService"
                 android:enabled="true" />

        <receiver android:name=".MyReceiver"/>

    </application>

</manifest>

这个警报仍在触发,无法在这样做后停止/取消。

3个回答

1
创建闹钟时,您需要使用此PendingIntent
Intent myIntent = new Intent(MainActivity.getAppContext(), MyReceiver.class);
pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 10, myIntent,0);

当您尝试取消时,您会使用此PendingIntent:
Intent intentt = new Intent(MainActivity.getAppContext(), NextActivity.class);
PendingIntent pintent = PendingIntent.getService(this, 10, intentt, 0);

当您想取消闹钟时,需要使用相同的代码来创建PendingIntent。请使用getBroadcast()而不是getService(),并且使用MyReceiver.class而不是NextActivity.class

此外,您不需要在MainActivity中保存应用程序上下文。您可以删除所有这些静态内容。在执行new Intent(Context, Thing.class)时,只需将this用作Context参数即可。


谢谢回复,让我试一试。 - VVB
我按照您的回答尝试了,但还是没有运气,仍然面临相同的问题。 - VVB
一切看起来都很好。请卸载并重新安装您的应用程序。 - David Wasser
没有意义,抱歉。请解释一下正在发生的事情。此外,您已将此警报设置为每12 * 60 * 60毫秒重复一次,即每43秒一次。您怎么知道取消不起作用?您还可以使用“adb shell dumpsys alarm”检查待处理的警报列表。 - David Wasser
显示剩余4条评论

0

谢谢您的回复,但是您能否帮我找出代码中的问题呢? - VVB
@VB:从一个活动调用另一个活动的方法也是一个大问题,因此请使用“LocalBroadCastManager”更改当前代码,我相信问题将得到解决。 - ρяσѕρєя K
@VVB:如果你在实现LocalBroadCastManager时遇到任何问题,请告诉我。 - ρяσѕρєя K
好的,我会先实现它,如果遇到任何问题,我会告诉你。 - VVB
@VVB:在提供的示例链接中,“Activityone”表示您代码中的“MainActivity”,而“MainActivity”表示“NextActivity”。 - ρяσѕρєя K
显示剩余6条评论

-1

在按钮点击事件中写下以下代码,它对我有效!!!

            finish();


            Intent myIntent = new Intent(getBaseContext(),

                    MyBroadcastReceiver.class);

            PendingIntent pendingIntent
                    = PendingIntent.getBroadcast(getBaseContext(),
                    alaramid, myIntent, 0);

            AlarmManager alarmManager
                    = (AlarmManager) getSystemService(ALARM_SERVICE);

            alarmManager.cancel(pendingIntent);

//Navigate to your Activity
            Intent ii = new Intent(DisplayReminder.this, MenuActivity.class);
            ii.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
            startActivity(ii);

            finish();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接