android 为什么我的广播接收器不工作?

jchrr9hc  于 2023-04-10  发布在  Android
关注(0)|答案(9)|浏览(211)

我正在学习BroadCastReceiver.我试图用下面的代码实现的是,我想看到一个Toast当我切换到飞行模式,在应用程序是打开或不.我没有做什么/做错了?请帮助.谢谢
ConnectivityChangedReceiver.java 类

public class ConnectivityChangedReceiver extends BroadcastReceiver {

     @Override
     public void onReceive( Context context, Intent intent ){

          Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();

     }
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.kirathe.mos.c_max">
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<uses-permission android:name="android.permission.SEND_SMS"/>
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    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=".ConnectivityChangedReceiver">
        <intent-filter>
            <action android:name="android.intent.action.AIRPLANE_MODE">
            </action>
        </intent-filter>

    </receiver>

</application>

MainActivity.javawww.example.com

public class MainActivity extends AppCompatActivity {

     private TextView switchStatus;
     private Switch mySwitch;

     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
     }
}
h9vpoimq

h9vpoimq1#

Android文档:
https://developer.android.com/guide/components/broadcast-exceptions
作为Android 8.0(API级别26)后台执行限制的一部分,面向API级别26或更高级别的应用不能再在其清单中为隐式广播注册广播接收器。但是,目前有几个广播不受这些限制的限制。无论应用的目标API级别是什么,应用都可以继续为以下广播注册侦听器。

https://developer.android.com/distribute/best-practices/develop/target-sdk
Google Play将要求新应用从2018年8月1日起至少面向Android 8.0(API级别26),应用更新从2018年11月1日起面向Android 8.0。

**“android.intent.action.AIRPLANE_MODE”**已不在豁免广播列表中。因此,请在Activity而不是AndroidManifest中注册广播接收器。

gev0vcfq

gev0vcfq2#

所以我刚刚找到了解决我上面问题的方法。我改变了

<receiver android:name=".ConnectivityChangedReceiver">

<receiver android:name="ConnectivityChangedReceiver">

(没有名字开头的‘。‘。希望对一个搁浅的人有帮助!

iezvtpos

iezvtpos3#

广播接收器的官方文件说:

android:exported

广播接收器是否可以从其应用程序外部的源接收消息-如果可以,则为“真”,如果不可以,则为“假”。如果为“假”,则广播接收器可以接收的唯一消息是由具有相同用户ID的同一应用程序或多个应用程序的组件发送的消息。

m1m5dgzv

m1m5dgzv4#

这样试试,试试添加,android:exported=“true”:
//也添加此权限

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

 <receiver android:enabled="true" android:name=".ConnectivityChangedReceiver"
android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.ACTION_AIRPLANE_MODE_CHANGED"/>
        </intent-filter>
    </receiver>

The Real state is determined like this:

    @Override
    public void onReceive(Context context, Intent intent) {

        boolean isAirplaneModeOn = intent.getBooleanExtra("state", false);
        if(isAirplaneModeOn){

           // handle Airplane Mode on
        } else {
           // handle Airplane Mode off
        }
    }
4ktjp1zp

4ktjp1zp5#

如果您API级别大于26,则应向代码添加如下权限:

super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
   
val _receiver = cSmsListener() //<--you BroadCastreciever class 
val intentFilter = IntentFilter()

intentFilter.addAction(Telephony.Sms.Intents.SMS_RECEIVED_ACTION)
getApplicationContext().registerReceiver(_receiver, intentFilter);

var myPermission: Array<String> = arrayOf(Manifest.permission.RECEIVE_SMS, Manifest.permission.READ_SMS)
ActivityCompat.requestPermissions(this, myPermission,1)
vltsax25

vltsax256#

intent- filter在AndroidManifest.xml文件的receiver标签中不起作用。MainActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    IntentFilter intentFilter = new IntentFilter("android.intent.action.AIRPLANE_MODE");
    broadcastBattery bb = new broadcastBattery();
    registerReceiver(bb, intentFilter);
}

现在一切都很好。

epfja78i

epfja78i7#

您必须在manifest.xml文件中启用广播:

<receiver android:enabled="true" android:name=". ConnectivityChangedReceiver">
    <intent-filter>
        <action android:name="android.intent.action.AIRPLANE_MODE"/>
    </intent-filter>
</receiver>
kd3sttzy

kd3sttzy8#

您需要将接收器放入bundles包中:

package my.bundles.id;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.widget.Toast;

public class ConnectivityChangedReceiver extends BroadcastReceiver {

@Override
public void onReceive( Context context, Intent intent )
{
    Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();

}
}

你应该把它放在一个与bundleId相同的包中,这样就可以让上面的工作了。name字段中的第一个点意味着Class是bundles命名空间的成员。所以,因为它不在包中,所以这个点让它看起来在错误的地方。

axzmvihb

axzmvihb9#

遵循上述规则,直到您的应用程序无法正常工作,然后转到您的应用程序设置并清除数据,然后允许权限。确保它是有帮助的谢谢。

相关问题