Android Lollipop становится администратором устройства не работает

Я следую этому руководству о том, как заставить мой запрос приложения стать администратором устройства.
Это отлично работает на любых версиях Android 4.x с любым телефоном, но не работает на Lollipop (я пытался использовать Nexus 5 и Nexus 7).

Logcat обувает следующую ошибку:

*11-02 07:37:09.649: W/DeviceAdminAdd(10020): Cannot start ADD_DEVICE_ADMIN as a new task* 

Кто-нибудь еще сталкивается с этой проблемой с Lollipop? Что может быть причиной?
Я просмотрел все части руководства и убедился, что мои XML, манифест, приемник и т. Д. Все так, как должно быть (и, опять же, он работает на любой другой версии ОС или телефона, который я пробовал).

Если это имеет значение, я собираю приложение с целевым API = 17 и min API = 14 по соображениям совместимости.


Добавление файла манифеста:

 <?xml version='1.0' encoding='utf-8'?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.my.package" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="17" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" /> <uses-permission android:name="com.mycompany.permission.NFProvider_WRITE" /> <uses-permission android:name="com.mycompany.permission.NFProvider_READ" /> <uses-permission android:name="android.permission.READ_LOGS" /> <application android:name="com.mycompany.myapp.Application" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <receiver android:name="com.mycompany.myapp.NFAdminReceiver" android:permission="android.permission.BIND_DEVICE_ADMIN"> <meta-data android:name="android.app.device_admin" android:resource="@xml/admin"/> <intent-filter> <action android:name="android.app.action.DEVICE_ADMIN_ENABLED"/> </intent-filter> </receiver> <activity android:name="com.mycompany.myapp.ConnectMainActivity" android:label="@string/title_activity_connect_main" android:process="com.mycompany.ui" android:launchMode="singleInstance" android:screenOrientation="portrait" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name="com.mycompany.myapp.MainService" android:enabled="true" /> <meta-data android:name="applicationVersion" android:value="1.2.0.213" /> </application> </manifest> 

Код, создающий намерение:

 ComponentName mComponentName = new ComponentName(activity, NFAdminReceiver.class); Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mComponentName); intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, ADMIN_REQUEST_TITLE); activity.startActivityForResult(intent, ADMIN_INTENT); 

Активность переменной – это экземпляр ConnectMainActivity

Кажется, что это вызвало проблему с параметром singleInstance launchMode, и мне все еще интересно узнать, почему она вызывает проблему на Lollipop, а не на других версиях.

Пока что установка launchMode в singleTask разрешает проблему и, похоже, по-прежнему соответствует дизайну потока приложения.

Основная причина этого сообщения об ошибке – в DeviceAdminAdd.java . Существует такая проверка :

 if ((getIntent().getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { Log.w(TAG, "Cannot start ADD_DEVICE_ADMIN as a new task"); finish(); return; } 

Эта проверка уже была в 4.0.1 : API-уровень 14!

Объектом намерения этой проверки является намерение, инициирующее действие: DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN.

Из документов :

Активность «singleInstance» не позволяет никаким другим действиям быть частью его задачи.

Он не объясняет разницу между API 21 и API <21, но объясняет, почему установлен FLAG_ACTIVITY_NEW_TASK.