飞行模式接收机在清单?(Airplane Mode Receiver in Manifest?)

2019-08-17 08:36发布

我正在开发一款Android应用,将作为在工业环境下的手持控制器。 为了使平板电脑不太理想的带回家,我要去尝试和编程所有的时间打开飞行模式,但在4.2弃用,这也是我们正在使用才能有Android开放配件的版本。 但是我在想,如果我可以在清单之内。因而注册一个接收器,将推出我的应用程序随时随地飞行模式被改变,然后检查是否处于关闭状态,并提示用户重新打开它。

我曾尝试以下解决方案,还发现作为回答这个问题。

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<receiver android:name=".receiver.ConnectivityReceiver">
<intent-filter>
    <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>

我自己也尝试这样的代码:

<receiver android:enabled="true" android:name=".ConnectivityReceiver">
<intent-filter>
    <action android:name="android.intent.action.SERVICE_STATE"/>
</intent-filter>
</receiver>

还发现由saxos的aswer 这里 。

现在,这些方法都导致当飞行模式被改变我的应用程序推出。

是否有可能清单文件中注册飞行模式一BroadcaseReceiver和有意向推出的应用程序?

编辑1:我确实有广播接收器在Java代码中工作,这样我可以检测到这种情况,而我的应用程序被激活。 这不是我所期待的,但。 谢谢。

编辑2:这是我整个清单文件目前:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.i2c"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="17"
    android:targetSdkVersion="17" 
    android:maxSdkVersion="17"/>
    <!-- SDK 14 = 4.0 ICS
         SDK 17 = 4.2 JB -->             

<!-- Assures software is not loaded onto unsupported screen size, i.e. phones -->
<supports-screens android:xlargeScreens="true"
    android:largeScreens="true"
    android:normalScreens="false"
    android:smallScreens="false"
    android:anyDensity="true"/>

<uses-feature android:name="android.hardware.usb.accessory"/>

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.example.i2c.mainActivity"
        android:label="@string/app_name"  
        android:configChanges="keyboardHidden|orientation|screenSize"
        android:launchMode="singleTask">
        <intent-filter>
            <action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"/>
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.AIRPLANE_MODE" />
        </intent-filter>
        <meta-data android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
            android:resource="@xml/accessory_filter"/>
    </activity>
</application>

USB_ACCESSORY ATTACHEDMAIN发射器工作得很好,从开始我的应用程序onCreate点。 然而, AIRPLANE_MODE似乎并没有做任何事情。

这里是我的广播接收器是在Java代码中:

    private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver(){
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("I2CActivity", "onReceive of BroadcastReceiver()");
        String action = intent.getAction();
        if(ACTION_USB_PERMISSION.equals(action)) {
            Log.d("ACTION_USB_PERMISSION", action.toString());
            synchronized (this) {
                Log.d("syncronized", this.toString());
                UsbAccessory accessory = (UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
                if(intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                    if (accessory != null) {
                        OpenAccessory(accessory);
                    }
                }
                else {
                    Log.d("mUsbReceiver", "permission denied for accessory " + accessory);
                }
            }
        }
        else if(UsbManager.ACTION_USB_ACCESSORY_ATTACHED.equals(action)) {
            Log.d("ACTION_USB_ACCESSORY_ATTACHED", action.toString());
            UsbAccessory accessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
            if (accessory != null) {
                resumeAccessory();
            }
        }
        else if(UsbManager.ACTION_USB_ACCESSORY_DETACHED.equals(action)) {
            Log.d("ACTION_USB_ACCESSORY_DETACHED", action.toString());
            UsbAccessory accessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
            if (accessory != null) {
                closeAccessory();
            }
        }
        else if(Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(action)) {
            Log.e("Airplane Mode", "Airplane mode changed");
            airplaneMode = Settings.Global.getInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0) != 0;
        }
    }
};

但是从我的理解,这个应用程序在运行时进行了注册,我想即使该应用程序不运行时登录接收器。

Answer 1:

有了更好的理解Intents和XML定义接收我能想出解决办法。 这一问题已经在只有17 API测试。 这里是清单的代码:

<receiver android:name="com.example.i2c.AirplaneModeReceiver">
     <intent-filter>
         <action android:name="android.intent.action.AIRPLANE_MODE"/>
     </intent-filter>
</receiver>

然后创建一个名为AirplaneModeReceiver一个Java类文件,并把它下面:

public class AirplaneModeReceiver extends BroadcastReceiver {
   public void onReceive(Context context, Intent intent) {
       Intent startActivityIntent = new Intent(context, MainActivity.class);
       startActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
       context.startActivity(startActivityIntent);
   }    
}

现在,这将启动每当有飞行模式的改变的活动,无论是打开或关闭。 我没有追求检查编写代码飞行模式是否被关闭,然后开始活动的任何进一步的,因为切换到主屏幕启动风格的应用程序来代替。



Answer 2:

下面是接收器的代码段

public void onReceive(Context context, Intent intent) {
        if (intent.getAction().intern() == Intent.ACTION_AIRPLANE_MODE_CHANGED) {
// Launch your app here
}


文章来源: Airplane Mode Receiver in Manifest?