Приемник режима полета в манифесте?
Я работаю над разработкой приложения для 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>
также найден как aswer саксофонами здесь.
Теперь ни одно из этих решений не приводит к запуску моего приложения при изменении режима полета.
Можно ли зарегистрировать BroadcaseReceiver для режима полета в файле манифеста, и это намерение запустить приложение?
Редактировать 1: У меня есть BroadcastReceiver, работающий в 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 ATTACHED
и MAIN
лаунчер работает нормально и запускает мое приложение из onCreate
точка. Тем не менее AIRPLANE_MODE
похоже ничего не делает.
А вот мой BroadcastReceiver, который находится в коде 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;
}
}
};
однако, насколько я понимаю, это регистрируется только во время работы приложения, я хочу, чтобы получатель был зарегистрирован, даже когда приложение не запущено.
2 ответа
С лучшим пониманием Intents
и XML определены получатели, я смог понять это. Это было проверено только на API 17. Вот код для манифеста:
<receiver android:name="com.example.i2c.AirplaneModeReceiver">
<intent-filter>
<action android:name="android.intent.action.AIRPLANE_MODE"/>
</intent-filter>
</receiver>
А затем создайте файл класса Java с именем AirplaneModeReceiver и поместите в него следующее:
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);
}
}
Теперь это будет запускать действие всякий раз, когда происходит изменение в режиме полета, будь то включение или выключение. Я не занимался написанием кода для проверки, был ли выключен режим "В самолете", а затем запустил действие дальше, так как вместо этого переключился на приложение в стиле запуска домашнего экрана.
Вот фрагмент для получателя
public void onReceive(Context context, Intent intent) {
if (intent.getAction().intern() == Intent.ACTION_AIRPLANE_MODE_CHANGED) {
// Launch your app here
}