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

weylhg0b  于 2022-12-21  发布在  Android
关注(0)|答案(7)|浏览(177)

我正在制作一个闹钟应用程序。我有一个用户设置闹钟时间的活动。它注册了一个广播接收器类,我制作了这个类,以便在闹钟时间接收广播,使用AlarmManager。然后我在接收器onReceive()中启动一个新活动。当第二个活动开始时,闹钟声音在onStart()中播放。我如何判断我的活动是由接收器启动的还是用户正在使用该应用程序进行多任务处理?我不希望在用户将闹钟静音、按下Home键然后租用该应用程序(同时仍处于声音播放活动)。

pw136qt2

pw136qt21#

只需通过您在onReceive()方法中使用的Intent发送一个额外的:

Intent intent = new Intent(this, NextActivity.class);
intent.putExtras("playSound", true);

在您的“声音播放”活动中,您必须在onCreate()中播放声音

boolean playSound = getIntent().getBooleanExtra("playSound", false);

如果intent-extra“playSound”不存在或设置为false,则返回false;如果设置为true,则返回true。
onCreate()仅被调用一次(Activity启动时),而onStart()在用户每次重新进入Activity时(即通过最近使用的应用)都会被调用。

(图表source

  • Paused* 是在活动被占用时调用的(例如,电池电量低对话框),Stopped 是在您“退出”应用时调用的(例如,通过主页按钮)。
xdyibdwo

xdyibdwo2#

基于接收到的广播启动一个活动或服务等,那么你需要一个独立的广播接收器,你把它放在你的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中处理接收器的注册和注销,然后在接收器的onReceive方法中执行任何必要的操作,使Activity在接收广播时按照我想要的方式做出React。

rt4zxlrg

rt4zxlrg3#

您可以执行以下操作:
1.对于用户设置的每个报警,您可以在sharedpreference中设置一个布尔标记为true。例如,您有三个报警,那么在sharedpreference中您将有3个标记。
1.现在假设接收到alarm1的报警广播,并启动activity2。
1.现在,在活动2中,首先要检查在sharedpreference中设置的alarm1的标志是true还是false,如果为true,则播放声音。
1.当用户使警报静音或按下主页按钮时,您可以将此标志标记为false,因此下次如果用户从后台启动活动,sharedpreference中的标志将为false,并且不会播放声音。
通过在sqlite db表而不是sharedpreference中设置标志,可以实现与使用sqlite db相同的效果。

i34xakig

i34xakig4#

对于用于启动声音播放Activity的Intent,请使用FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS标志。因此,如果用户移出Activity,则无法恢复该Activity。

Intent intent = new Intent(context, SoundActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);

或在舱单上

<activity
        android:name="SoundActivity"
        android:excludeFromRecents="true" >
</activity>
jtoj6r0c

jtoj6r0c5#

有几种解决方案:
(1)一种方法是使用可在Activity之间共享的Singleton类。在此方法中,在BroadcastReceiver中设置Singleton类的布尔标志,然后在播放声音的Activity(从BroadcastReceiver中激发)中检查该标志。如果设置了该标志,请重置该标志。此解决方案假定广播接收器是Android应用程序包的一部分。
(2)或者,您也可以在从BroadcastReceiver启动Activity时使用Intet.putExtra(“Key”,Value)方法,您可以在从BroadcastReceiver启动的Activity中检查此键,以了解是谁启动了此Activity。
所以这个可以探测你从哪里来。
如果你只是想设置一个单一的闹铃,那么创建另一个活动来播放声音是可以的。如果你设置了重复闹铃(闹铃以多个间隔播放),我不确定你的应用程序会如何运行。
我更喜欢在广播接收器本身(在清单中注册为远程接收器)中为给定报警播放指定持续时间的声音(如30秒的声音,或者您可以要求用户配置它)。因此,这样您就可以使用相同的BroadcastReceiver为单次和多次重复报警播放声音。我将使用相同的PendingIntent设置单次和多次重复报警。

wljmcqd8

wljmcqd86#

您可以简单地在Intent中设置flag或任何值,以确定您在该类中的目的。
例如:为了播放声音,在Intent中将布尔值设置为TRUE,并使用bundle将其发送到该类。
埃尔塞
如果从其他类启动报警类,则将该布尔值设置为FALSE。

7fyelxc5

7fyelxc57#

这是代码,以确定应用程序是否通过广播接收器启动.

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

    String AlarmTriggerString = (String)intent.getSerializableExtra("AlarmTrigger");
    Intent i = new Intent();
    i.setClassName("com.prasath.viki.bot","com.prasath.viki.bot.MainActivity");
    intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT|Intent.FLAG_ACTIVITY_NEW_TASK);
    i.putExtra("FromBroacastReceiver",true);
    i.putExtra("AlarmTrigger",AlarmTriggerString);
    context.startActivity(i);

    }
}

protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    boolean FromReceiver = (boolean)getIntent().getSerializableExtra("FromBroacastReceiver");
    String AlarmTriggerString = (String) getIntent().getSerializableExtra("AlarmTrigger");
    if(AlarmTriggerString != null && FromReceiver != null && FromReceiver == true)
    {
       // do something
    }
}

相关问题