【问题标题】:How to stop/cancel alarm manager in another activity?如何在另一个活动中停止/取消警报管理器?
【发布时间】:2016-12-30 05:44:13
【问题描述】:

我正在 Activity A 中创建警报并在另一个 Activity B 中停止/取消。我很努力但没有运气,下面是我的代码:

MainAcitivity

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

}

我的接收者

    public class MyReceiver extends BroadcastReceiver
    {

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

         }

    }

我的警报服务

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>

它仍在发出警报,执行此操作后无法停止/取消。

【问题讨论】:

    标签: android android-activity broadcastreceiver android-service alarmmanager


    【解决方案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 参数

    【讨论】:

    • 谢谢回复,让我试试
    • 我按照你的回答试过了,但运气不好仍然面临同样的问题
    • 一切看起来都很好。请卸载并重新安装您的应用。
    • 另外,您对stopService() 的调用现在将不起作用,因为您已将intentt 更改为包含广播Intent。您将需要创建另一个(不同的)Intent 以传递给stopService() 停止您的服务。也可以在拨打alarm.cancel()后拨打pintent.cancel()取消PendingIntent,但这不是必须的。
    【解决方案2】:

    使用LocalBroadcastManager 代替静态方式调用方法,而不是使用LocalBroadcastManager 在同一进程中的两个组件之间进行通信。

    参见以下示例:Android Program to Demonstrate Local BroadCastManager

    【讨论】:

    • 感谢您的回复,但您能找出我的代码中的问题吗?
    • @VB:从一个活动调用方法到另一个活动也是一个大问题,所以用LocalBroadCastManager 更改当前代码然后我相信问题会解决
    • @VVB:如果您在实施LocalBroadCastManager时有任何问题,请告诉我
    • 好的。将首先实施并让您知道是否遇到任何问题。
    • @VVB:在提供的示例链接中,Activityone 表示您的代码中的 MainActivityMainActivity 表示 NextActivity
    【解决方案3】:

    OnButton Click 写下面的代码,它对我有用!!!!

                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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多