有没有办法在现有使用广播接收器的应用程序后保持重复警报工作?

Is there a way to keep a repeating alarm working after existing the app that uses a broadcast receiver?

我是 Android 的新手。我正在尝试创建一个应用程序,该应用程序使用 BroadcastReceiver 在主 activity 上执行由重复警报触发的功能。我读到我必须动态注册我所做的 broadcastReceiver - 这是为了能够在主 activity 上执行该功能。我面临的问题是,一旦应用程序退出,alarm 就会停止工作。我读到这是设计使然 - 有没有办法克服这个问题,还是我必须使用 service?提前致谢。

示例代码:

public class AlarmReceiver extends BroadcastReceiver {  
    @Override  
    public void onReceive(Context context, Intent intent) {  
        Toast.makeText(context, "from AlarmReceiver", Toast.LENGTH_SHORT).show();  
    }
}

public class MainActivity extends AppCompatActivity {  
    private PendingIntent pendingIntent;  
    private AlarmManager manager;  
    private AlarmReceiver myReceiver = null;  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        myReceiver = new AlarmReceiver();  
        IntentFilter myIntentFilter = new IntentFilter("ANY_ACTION");  
        registerReceiver(myReceiver,  myIntentFilter);  
        Intent myIntent = new Intent();  
        myIntent.setAction("ANY_ACTION");  
        pendingIntent = PendingIntent.getBroadcast(this, 0,myIntent,0);  
    }  
      public void startAlarm(View view) {  
        manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);  
        int interval = 1500;  
        manager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),   interval, pendingIntent);  
        Toast.makeText(this, "Alarm Set", Toast.LENGTH_LONG).show();  
    }     
}

我认为,当您的应用不是 运行 时闹钟停止工作的原因是您在本地使用 [=13= 注册了 AlarmReceiver ].如果您想注册您的 AlarmReceiver,以便即使您的应用不是 运行,它也能继续工作,您需要在 AndroidManifest.xml 中注册它。

首先,像这样将您的接收器添加到 AndroidManifest.xml 中:

  <application>    
       //...
       <receiver android:name=".AlarmReceiver">
        </receiver>
       //...
  </application>

然后像这样设置你的闹钟(记住:不要将闹钟间隔设置得太短,至少设置 1 分钟;你在你的代码中将你的间隔设置为 1.5 秒 - 它可能不起作用):

    int interval = 60 * 1000;
    Intent intent=new Intent(this, AlarmReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 1, intent, 0);
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pendingIntent);

然后在 onRecieve 中触发警报时,做您想做的事:

public class AlarmReceiver extends BroadcastReceiver {
     @Override
     public void onReceive(Context context, Intent intent) {

    AudioManager audioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
    SharedPreferences sharedPreferences = context.getSharedPreferences("Settings", 0);
    int iDefValue=0; 
    int iDayAlarmVal= sharedPreferences.getInt("something", iDefValue); 
    // and so on...
                 }
         }