8

Android 5.0.1 を実行している Nexus 4 でタスク ロック API をいじっています。私のデバイス所有者アプリは、「ロック」と「ロック解除」の 2 つのボタンで構成されており、単に と を呼び出すだけstartLockTask()ですstopLockTask()。これで本当にすべてですが、定型文を見たいと主張する人もいます。

public class MainActivity extends Activity {    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.lockButton).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startLockTask();
            }           
        });

        findViewById(R.id.unlockButton).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                stopLockTask();
            }           
        });
    }
}

タスクがすでにロックされているときに「ロック」ボタンを押しても問題はありません。しかし、タスクがロックされていないときに「ロック解除」ボタンを押すと、NPE が発生します。

02-12 22:58:11.942: E/AndroidRuntime(12888): java.lang.NullPointerException: Attempt to read from field 'android.content.Intent com.android.server.am.TaskRecord.intent' on a null object reference
02-12 22:58:11.942: E/AndroidRuntime(12888):    at android.os.Parcel.readException(Parcel.java:1546)
02-12 22:58:11.942: E/AndroidRuntime(12888):    at android.os.Parcel.readException(Parcel.java:1493)
02-12 22:58:11.942: E/AndroidRuntime(12888):    at android.app.ActivityManagerProxy.stopLockTaskMode(ActivityManagerNative.java:5245)
02-12 22:58:11.942: E/AndroidRuntime(12888):    at android.app.Activity.stopLockTask(Activity.java:6179)
02-12 22:58:11.942: E/AndroidRuntime(12888):    at com.chalcodes.kiosk.MainActivity$2.onClick(MainActivity.java:44)
02-12 22:58:11.942: E/AndroidRuntime(12888):    at android.view.View.performClick(View.java:4756)
02-12 22:58:11.942: E/AndroidRuntime(12888):    at android.view.View$PerformClick.run(View.java:19749)
02-12 22:58:11.942: E/AndroidRuntime(12888):    at android.os.Handler.handleCallback(Handler.java:739)
02-12 22:58:11.942: E/AndroidRuntime(12888):    at android.os.Handler.dispatchMessage(Handler.java:95)
02-12 22:58:11.942: E/AndroidRuntime(12888):    at android.os.Looper.loop(Looper.java:135)
02-12 22:58:11.942: E/AndroidRuntime(12888):    at android.app.ActivityThread.main(ActivityThread.java:5221)
02-12 22:58:11.942: E/AndroidRuntime(12888):    at java.lang.reflect.Method.invoke(Native Method)
02-12 22:58:11.942: E/AndroidRuntime(12888):    at java.lang.reflect.Method.invoke(Method.java:372)
02-12 22:58:11.942: E/AndroidRuntime(12888):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
02-12 22:58:11.942: E/AndroidRuntime(12888):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

現在のタスクがロックされているかどうかをテストする方法はありますか?

これは、登録されていない受信者を登録解除しようとすると、unregisterReceiver(...)が爆発するのと似ています。内部状態を追跡する必要がある、動作の悪い API だと思います。しかしstopLockTask()、さらに悪いことに、通常はアクティビティが一時停止されたときに受信者を登録解除しますが、通常はタスクのロックを解除しません。したがって、次のアクティビティはロックされた状態で作成されますが、ロックされていることを知る方法はありません。したがって、基本的には、ロックされた状態をインテントと保存されたインスタンス バンドルで渡す必要があります。または、すべての呼び出しをstopLockTask()醜いtry/ catch...で囲むだけです。

ここで意味がありますか?

編集: issue #150089を作成しました。

4

2 に答える 2