我做了这个小应用程序,它没有出现任何构建错误,它可以在模拟器上运行而不会崩溃,但是它没有收听应有的系统广播。
请帮助我找到此代码的问题。
代码应执行的操作:每当铃声模式发生任何变化时,应用程序都应收听它们,并触发一个活动以显示为对话框,提示“更改了铃声模式”。我故意不干杯,因为我最终需要对话来完成手头的任务。
代码:
AndroidManifest.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.firstbroadcastapp">
<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=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".RingerReceiver" android:exported="true">
<intent-filter>
<action android:name="android.media.RINGER_MODE_CHANGED"/>
</intent-filter>
</receiver>
<activity android:name=".DialogActivity" android:theme="@style/Theme.AppCompat.Dialog"
android:excludeFromRecents="true"/>
</application>
</manifest>
RingerReceiver.java文件:
package com.example.android.firstbroadcastapp;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class RingerReceiver extends BroadcastReceiver {
public String TAG = "This is an example run.";
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "This is the beginning of onReceive().");
Intent dialogintent = new Intent(context, DialogActivity.class);
context.startActivity(dialogintent);
}
}
DialogActivity.java文件:
package com.example.android.firstbroadcastapp;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
public class DialogActivity extends AppCompatActivity{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dialog);
this.setFinishOnTouchOutside(false);
}
}
activity_dialog.xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center">
<TextView
android:layout_height="120dp"
android:layout_width="match_parent"
android:text="@string/dialogText"
android:gravity="center"
android:background="@color/colorPrimary"
android:textSize="20sp"
android:textStyle="bold"
/>
</LinearLayout>
我认为这里不需要添加activity_main.xml和MainActivity.java文件,因为它们在应用程序中没有任何主要作用。
该应用程序已按预期启动,但是每当铃声模式发生任何变化时,我在清单中注册的BroadcastReceiver均无法正常工作,因此我希望出现的对话框也无法正常运行。
答案 0 :(得分:0)
如果目标android版本是android Oreo(26版)及更高版本,则您不能将<action android:name="android.media.RINGER_MODE_CHANGED"/>
添加为在android menifest.xml文件中的隐式广播
检查下面的链接
要收听ringer_mode_change广播,请检查以下代码
BroadcastReceiver receiver=new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
//code...
}
};
IntentFilter filter=new IntentFilter(
AudioManager.RINGER_MODE_CHANGED_ACTION);
registerReceiver(receiver,filter);
要在android menifest.xml文件中注册隐式广播,它应该在例外列表中