Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何判断我的活动是否由广播接收器启动?_Android_Android Intent_Broadcastreceiver_Alarmmanager - Fatal编程技术网

Android 如何判断我的活动是否由广播接收器启动?

Android 如何判断我的活动是否由广播接收器启动?,android,android-intent,broadcastreceiver,alarmmanager,Android,Android Intent,Broadcastreceiver,Alarmmanager,我正在制作一个闹钟应用程序。我有一个活动,用户在其中设置报警时间。这注册了一个广播接收器类,我使用AlarmManager在报警时接收广播。然后,我在receiversonReceive()中启动一个新活动。当第二个活动开始时,将在onStart()中播放闹钟声音。我如何判断我的活动是由接收者启动的,还是用户只是在用应用程序进行多任务处理?我不希望在用户关闭闹钟、按下home(主页)按钮,然后租用应用程序(同时仍在进行声音播放活动)时播放我的声音 您可以执行以下操作: 对于每个报警用户集,在Sh

我正在制作一个闹钟应用程序。我有一个活动,用户在其中设置报警时间。这注册了一个广播接收器类,我使用
AlarmManager
在报警时接收广播。然后,我在receivers
onReceive()
中启动一个新活动。当第二个活动开始时,将在
onStart()
中播放闹钟声音。我如何判断我的活动是由接收者启动的,还是用户只是在用应用程序进行多任务处理?我不希望在用户关闭闹钟、按下home(主页)按钮,然后租用应用程序(同时仍在进行声音播放活动)时播放我的声音

您可以执行以下操作:

  • 对于每个报警用户集,在SharedReference中设置一个布尔标志为true。例如,您有三个报警,然后在SharedReference中您将有三个标志
  • 现在假设接收到报警1的报警广播,并启动活动2
  • 现在在activity2中,首先要检查的是您在SharedReference中设置的alarm1标志是否为true或false(如果为true,则播放声音)
  • 当用户关闭报警或按home按钮时,您可以将此标志标记为false,因此下次如果用户从后台启动活动,SharedReference中的标志将为false,并且不会播放声音
  • 通过在sqlite db表中设置标志,而不是在SharedReference中设置标志,可以使用sqlite db实现同样的效果

    您可以执行以下操作:

  • 对于每个报警用户集,在SharedReference中设置一个布尔标志为true。例如,您有三个报警,然后在SharedReference中您将有三个标志
  • 现在假设接收到报警1的报警广播,并启动活动2
  • 现在在activity2中,首先要检查的是您在SharedReference中设置的alarm1标志是否为true或false(如果为true,则播放声音)
  • 当用户关闭报警或按home按钮时,您可以将此标志标记为false,因此下次如果用户从后台启动活动,SharedReference中的标志将为false,并且不会播放声音

  • 通过在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)方法