在清单文件中的飞行模式接收器是什么?

4
我正在开发一款Android应用程序,它将用作工业环境中的手持控制器。为了让平板电脑不那么容易被带走,我打算尝试编程方式始终开启飞行模式,但在4.2中已被弃用,这也是我们使用的版本,以便拥有Android Open Accessory。然而,我想如果我可以在清单中注册一个接收器,使其在任何时候更改飞行模式时启动我的应用程序,然后检查它是否关闭并提示用户重新打开它。

我已经尝试过以下解决方案,也作为问题的答案找到。

<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在Stack Overflow上提出的答案相同的解决方案。

然而,这些解决方案都没有在飞行模式更改时启动我的应用程序。

是否可以在清单文件中为飞行模式注册BroadcaseReceiver,并让该意图启动应用程序?

编辑1:我已经在Java代码中使BroadcastReceiver工作,以便在我的应用程序处于活动状态时检测此情况。但这不是我要寻找的。谢谢。

编辑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代码中的BroadcastReceiver:

    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;
        }
    }
};

然而据我所知,只有当应用程序运行时才会注册此内容,我希望能够注册一个即使应用程序未运行也能接收的接收器。


@DjHacktorReborn 我需要添加任何 uses-permission 标签吗?谢谢。 - TronicZomB
@DjHacktorReborn 谢谢你的回答,但是这似乎不能在飞行模式改变时启动我的应用程序。 - TronicZomB
我已发布了我的完整清单文件。 - TronicZomB
有没有接收器类或任何继承广播接收器的类? - DjHacktorReborn
我发布了我的BroadcastReceiver。问题是清单中的“USB_ACCESSORY_ATTACHED”接收器从未进入BroadcastReceiver,但它按照我的要求启动了我的应用程序。我希望AIRPLANE_MODE也能有类似的功能。现在,一旦BroadcastReceiver(BR)中的布尔值airplaneMode发生变化,我的扩展了BR的I2CActivity中的线程就会启动一个AlertDialog来提示用户。 - TronicZomB
显示剩余3条评论
2个回答

9

通过更好地理解Intents和XML定义的接收器,我能够找出这个问题。这已在仅限于API 17的情况下进行了测试。以下是清单文件的代码:

<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);
   }    
}

现在,只要飞行模式开启或关闭,就会启动该活动。我没有进一步编写代码来检查飞行模式是否关闭,然后启动该活动,因为我改用了一个类似于主屏幕启动器的应用程序。


有人能否确认以上代码是否适用于早期的API版本(例如-Android 2.3)?因为我已经设置了与上述完全相同的接收器,而类似的接收器可以正常工作,但是飞行模式接收器似乎根本没有被触发,我不知道原因。 - Haravikk

5
这里是接收器的代码片段。
public void onReceive(Context context, Intent intent) {
        if (intent.getAction().intern() == Intent.ACTION_AIRPLANE_MODE_CHANGED) {
// Launch your app here
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接