2

物事は簡単です: アイコンを押して、電話機をスタンバイ状態にします。苛立たしい部分は電話から来ています.時々、スタンバイ状態のままではなく、ランダムに画面が起動し、ロック画面が表示されます. この動作をトリガーする条件はまだ見つかっていません。3 ~ 5 回に 1 回程度です。アプリには管理者権限があり、不思議なことにカスタム ROM では正常に機能しましたが、在庫の JellyBean 4.1.1 では機能しません。

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        deviceManger = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
        compName = new ComponentName(this, MyAdmin.class);

        boolean active = deviceManger.isAdminActive(compName);
        if (active) {
            finish();
            deviceManger.lockNow();
      }
   }

次のようなxmlポリシーファイルがあります

<device-admin xmlns:android="http://schemas.android.com/apk/res/android" >
    <uses-policies>
        <force-lock>
        </force-lock>
    </uses-policies>
</device-admin>

Androidマニフェストは問題ないようです

<receiver
            android:name=".MyAdmin"
            android:permission="android.permission.BIND_DEVICE_ADMIN" >
            <meta-data
                android:name="android.app.device_admin"
                android:resource="@layout/policies" >
                <intent-filter>
                    <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" >
                    </action>
                </intent-filter>
            </meta-data>
        </receiver>

問題は、なぜこれが起こっているのか理解できないということです。これは、クリーン インストールされた 4.1.1 の在庫を持つ Galaxy Nexus で発生しています。コードは非常にシンプルです。postDelayed が 500 ミリ秒の Handler を作成して、lockNow() を再度実行することもできますが、デバイスによっては 500 ミリ秒では不十分な場合はどうでしょうか。

ロック画面が表示されると、logcat には次の情報が表示されます。

07-26 20:45:27.446: I/ActivityManager(300): START {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.alinberce.standbytouch/.StandByActivity bnds=[168,1040][296,1168] u=0} from pid 524
07-26 20:45:27.634: D/dalvikvm(300): GC_FOR_ALLOC freed 1695K, 21% free 20113K/25351K, paused 69ms, total 69ms
07-26 20:45:27.650: D/SurfaceFlinger(124): About to give-up screen, flinger = 0x41b48af0
07-26 20:45:27.665: V/LockPatternKeyguardView(300): Set visibility on com.android.internal.policy.impl.LockPatternKeyguardView$4@41e57948 to 8388608
07-26 20:45:27.790: V/TransportControlView(300): Create TCV com.android.internal.widget.TransportControlView@419f9b08
07-26 20:45:27.861: D/dalvikvm(300): GC_CONCURRENT freed 528K, 16% free 21541K/25351K, paused 15ms+7ms, total 89ms
07-26 20:45:28.204: W/BufferQueue(124): [com.android.launcher/com.android.launcher2.Launcher] cancelBuffer: BufferQueue has been abandoned!
07-26 20:45:28.228: V/KeyguardViewManager(300): KGVM: Set visibility on com.android.internal.policy.impl.KeyguardViewManager$KeyguardViewHost@41d2ef48 to 6291456
07-26 20:45:28.236: D/PhoneStatusBar(399): disable: < expand icons alerts ticker system_info back home RECENT* clock >
07-26 20:45:28.243: I/Choreographer(300): Skipped 35 frames!  The application may be doing too much work on its main thread.
07-26 20:45:28.329: V/LockPatternKeyguardView(300): Set visibility on com.android.internal.policy.impl.LockPatternKeyguardView$4@41e57948 to 8388608
07-26 20:45:28.329: D/PhoneStatusBar(399): disable: < expand icons alerts ticker system_info BACK* HOME* RECENT CLOCK* >
07-26 20:45:28.407: V/LockPatternKeyguardView(300): Set visibility on com.android.internal.policy.impl.LockPatternKeyguardView$4@41e57948 to 8388608
07-26 20:45:28.423: V/TransportControlView(300): Create TCV com.android.internal.widget.TransportControlView@41e953f8
07-26 20:45:28.431: I/WindowManager(300): Lock screen displayed!
07-26 20:45:28.446: V/LockPatternKeyguardView(300): Set visibility on com.android.internal.policy.impl.LockPatternKeyguardView$4@41e57948 to 8388608
07-26 20:45:28.501: V/LockPatternKeyguardView(300): Set visibility on com.android.internal.policy.impl.LockPatternKeyguardView$4@41e57948 to 8388608
07-26 20:45:28.704: D/SurfaceFlinger(124): Screen about to return, flinger = 0x41b48af0
07-26 20:45:28.704: E/PowerManagerService(300): Excessive delay setting brightness: 271ms, mask=2

アイデアを共有してください...

4

2 に答える 2

1

私が見つけた唯一の合理的な解決策は、ハンドラーを使用することでした

            Handler handlerUI = new Handler();
            handlerUI.postDelayed(new Runnable() {
                @Override
                public void run() {
                    deviceManger.lockNow();
                }
            }, 500);
            Handler handlerUI2 = new Handler();
            handlerUI2.postDelayed(new Runnable() {
                @Override
                public void run() {
                    deviceManger.lockNow();
                }
            }, 900);

このハンドラーを使用して以来、画面のフラッシュは経験しておらず、毎日アプリを使用しています。市場でアプリを見つけることができますhttps://play.google.com/store/apps/details?id=com.alinberce.standbytouch

于 2012-08-23T06:43:39.087 に答える
0

最初にデバイスをロックしてから、アクティビティを終了する必要があります...

このコードの代わりに:

 finish();
 deviceManger.lockNow();

これを使って :

 deviceManger.lockNow();
 finish();
于 2012-12-22T12:50:01.090 に答える