【问题标题】:Can't call the BroadcastReceiver from an Activity无法从 Activity 调用 BroadcastReceiver
【发布时间】:2018-07-20 16:17:24
【问题描述】:

我是 android 新手,这里有两个活动和一个 BroadcastReceiver。

我正在尝试从第一个活动到第二个活动调用 BroadcastReceiver。

Manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.aviz.www.reminder">

    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".Activity_Classes.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=".Activity_Classes.AlarmActivity"
            android:screenOrientation="portrait" />
        <activity
            android:name=".Activity_Classes.CreateAlarm"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="stateAlwaysHidden" />
<activity android:name=".Activity_Classes.WakeUpScreen"></activity>
        <receiver
            android:name=".AlarmReceiver"
            android:enabled="true" />
    </application>

</manifest>

WakeUpScreen.java

 mStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                alarmActivity.stopAlarm(getBaseContext());
            }
        });

我正在尝试从唤醒屏幕停止警报,因为我调用了 AlarmActivity 中的方法来取消当前的 pendingIntent

AlarmActivity.java

   public void stopAlarm(Context context){
      Intent intent = new Intent(context, AlarmReceiver.class);
      intent.setAction("ALARM_OFF");
      PendingIntent pendingIntent = PendingIntent.getBroadcast(context,mAlarmId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
      AlarmManager alarmManager = (AlarmManager) context.getSystemService(ALARM_SERVICE);
      alarmManager.cancel(pendingIntent);
  }

通过这个方法(intent)我想调用 BroadcastReceiver 来停止(当前的pendingIntent)警报。

AlarmReceiver.java

public class AlarmReceiver extends BroadcastReceiver {

    public void onReceive(Context context, Intent intent) {

        MediaPlayer player = MediaPlayer.create(context, R.raw.alarmtone);

        String alarmAction = intent.getAction();
        if (alarmAction.equals("ALARM_ON")) {
            Intent intent1 = new Intent(context, WakeUpScreen.class);
            context.startActivity(intent1);

            player.setLooping(true);
            player.setVolume(100, 100);
            player.start();

        } else if (alarmAction.equals("ALARM_OFF")) {
            player.stop();
            player.release();
        }
    }
}

在调试从 WakeUpScreen.java 调用的应用程序 stopAlarm(Context context) 方法时,调试器也越过了 stopalarm() 方法中的所有行,但没有调用 AlarmReceiver。

谁能帮我解决这个问题。

【问题讨论】:

  • 检查我更新的答案。
  • ALARM_ON 和 ALARM_OFF 是针对您的意图的操作或附加功能?
  • 这是@Man的动作
  • 那你是怎么做的intent.putExtra("Action","ALARM_OFF"),只是额外的。请你从Manifest And Receiver的onReceive方法中发布你的receiver部分吗?
  • 我会在 5 分钟内更新我所有的代码@Man

标签: android broadcastreceiver alarmmanager


【解决方案1】:

AFAIK AlarmManager.cancel 仅用于取消现有的 PendingIntent 任务。
并且它在取消时不会执行待处理的意图。

在取消警报后,您必须手动发送带有“ALARM OFF”额外意图的广播。

 IntentFilter intentFilter = new IntentFilter();
 intentFilter.addAction("ALARM_ON");
 intentFilter.addAction("ALARM_OFF");
 LocalBroadcastManager.getInstance(this).registerReceiver(new AlarmReceiver(), 
 intentFilter);
 mStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                alarmActivity.stopAlarm(getBaseContext());

                Intent intent = new Intent("ALARM_OFF");
                intent.setClass(WakeUpScreen.this, AlarmReceiver.class);
                LocalBroadcastManager.getInstance(WakeUpScreen.this).sendBroadcast(intent);

            }
        });

【讨论】:

  • 您能否编辑我的代码并使其工作?“在您的情况下,取消警报后,您必须手动发送带有“警报关闭”额外意图的广播。”我无法理解这些@Man
  • 寻找你的回复@Man
  • 没关系。您可以在 Manifest 中定义您的操作 ALARM_ON、ALARM_OFF。但是在注册时我已经处理好了。
  • 你尝试调试了吗?它进入 Receiver 了吗?
  • 不去接收器,但它跨越了wakeupscreen @Man的onClick内的所有行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-06
  • 2014-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多