Android 如何判断我的活动是否由广播接收器启动?
我正在制作一个闹钟应用程序。我有一个活动,用户在其中设置报警时间。这注册了一个广播接收器类,我使用Android 如何判断我的活动是否由广播接收器启动?,android,android-intent,broadcastreceiver,alarmmanager,Android,Android Intent,Broadcastreceiver,Alarmmanager,我正在制作一个闹钟应用程序。我有一个活动,用户在其中设置报警时间。这注册了一个广播接收器类,我使用AlarmManager在报警时接收广播。然后,我在receiversonReceive()中启动一个新活动。当第二个活动开始时,将在onStart()中播放闹钟声音。我如何判断我的活动是由接收者启动的,还是用户只是在用应用程序进行多任务处理?我不希望在用户关闭闹钟、按下home(主页)按钮,然后租用应用程序(同时仍在进行声音播放活动)时播放我的声音 您可以执行以下操作: 对于每个报警用户集,在Sh
AlarmManager
在报警时接收广播。然后,我在receiversonReceive()
中启动一个新活动。当第二个活动开始时,将在onStart()
中播放闹钟声音。我如何判断我的活动是由接收者启动的,还是用户只是在用应用程序进行多任务处理?我不希望在用户关闭闹钟、按下home(主页)按钮,然后租用应用程序(同时仍在进行声音播放活动)时播放我的声音 您可以执行以下操作:
通过在sqlite db表中设置标志,而不是在SharedReference中设置标志,可以使用sqlite db实现同样的效果 只需通过您在
onReceive()方法中使用的意图发送一个额外的:
Intent intent = new Intent(this, NextActivity.class);
intent.putExtras("playSound", true);
在“声音播放”活动中,必须在onCreate()中播放声音。
:
boolean playSound = getIntent().getBooleanExtra("playSound", false);
如果意图额外“播放声音”不存在或设置为false,则返回false;如果设置为true,则返回true
onCreate()
只调用一次(当活动启动时),而onStart()
每次用户重新进入您的活动时(即通过最近的应用程序)都会被调用。您可以在生命周期中看到这一点:
当有东西覆盖了您的活动(例如电池电量不足对话框)时,会调用暂停,如果您“退出”应用程序(例如通过主页按钮),则会调用停止。只需通过您在onReceive()方法中使用的意图发送额外信息即可。
方法:
Intent intent = new Intent(this, NextActivity.class);
intent.putExtras("playSound", true);
在“声音播放”活动中,必须在onCreate()中播放声音。
:
boolean playSound = getIntent().getBooleanExtra("playSound", false);
如果意图额外“播放声音”不存在或设置为false,则返回false;如果设置为true,则返回true
onCreate()
只调用一次(当活动启动时),而onStart()
每次用户重新进入您的活动时(即通过最近的应用程序)都会被调用。您可以在生命周期中看到这一点:
当有东西覆盖了您的活动(例如,电池电量不足对话框)时,会调用暂停,如果您“退出”应用程序(例如,通过主页按钮),则会调用停止。对于用于启动声音播放活动的意图,请使用“活动”标志“排除当前”标志。因此,如果用户移出活动,它将无法恢复
Intent intent = new Intent(context, SoundActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
或在舱单上
<activity
android:name="SoundActivity"
android:excludeFromRecents="true" >
</activity>
对于用于启动声音播放活动的意图,请使用标志“活动”“排除”“最近”标志。因此,如果用户移出活动,它将无法恢复
Intent intent = new Intent(context, SoundActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
或在舱单上
<activity
android:name="SoundActivity"
android:excludeFromRecents="true" >
</activity>
根据接收到的广播启动活动或服务等,然后需要一个独立的广播接收器,并将其放入android清单文件中。如果希望活动本身响应广播,则在活动中创建广播接收器的实例并在其中注册
public class BRActivity extends Activity {
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
..................
..................
}
};
public void onResume() {
super.onResume();
IntentFilter filter = new IntentFilter();
filter.addAction(BROADCAST_ACTION);
this.registerReceiver(this.broadcastReceiver , filter);
}
public void onPause() {
super.onPause();
this.unregisterReceiver(this.broadcastReceiver );
}
}
因此,这种方式在创建类时实例化接收方(也可以在onCreate中执行)。然后在onResume/onPause中,我处理注册和取消注册接收者。然后在receiver的onReceive方法中,我会做任何必要的事情,使活动在接收广播时以我希望的方式作出反应。根据接收到的广播启动活动或服务等,然后您需要一个独立的广播接收器,并将其放入android清单文件中。如果希望活动本身响应广播,则在活动中创建广播接收器的实例并在其中注册
public class BRActivity extends Activity {
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
..................
..................
}
};
public void onResume() {
super.onResume();
IntentFilter filter = new IntentFilter();
filter.addAction(BROADCAST_ACTION);
this.registerReceiver(this.broadcastReceiver , filter);
}
public void onPause() {
super.onPause();
this.unregisterReceiver(this.broadcastReceiver );
}
}
因此,这种方式在创建类时实例化接收方(也可以在onCreate中执行)。然后在onResume/onPause中,我处理注册和取消注册接收者。然后,在Receiver的onReceive方法中,我会采取一切必要的措施,使活动在接收广播时做出我想要的反应。有两种解决方案:
(1) 一种方法是使用可以跨活动共享的单例类。
在这种方法中,在BroadcastReceiver中设置Singleton类的布尔标志,然后在播放声音的活动(从BroadcastReceiver触发)中检查该标志。如果设置了该标志,请重置该标志。此解决方案假定广播接收器是Android应用程序包的一部分
(二)
或者,您也可以使用Intet.putExtra(“Key”,Value)方法