4

ロック画面ウィジェットにボタンがあり、ボタンを押すとアクティビティを起動したいのですが。画面がロックされている場合、ユーザーがPINやパターンなどを入力しなくても、アクティビティがロック画面上に表示されるようにします。ユーザーがアクティビティを離れると、ロック画面が再表示されます。

について知っていますが、ADBシェルから手動で起動すると、ロック画面WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKEDにアクティビティが表示されます。am start問題は、ウィジェットのボタンを押すと、アクティビティが作成される前にロック解除PINを入力するようになることです。

ウィジェットプロバイダーに次のコードがあります。

@Override
public void onUpdate(final Context context, final AppWidgetManager appWidgetManager, final int[] appWidgetIds) {
    for (final int appWidgetId : appWidgetIds) {
        // Get the RemoteViews for controlling this widget instance.
        final RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.my_widget);

        // Construct an intent to launch the activity.
        final Intent intent = new Intent(context, MyActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        // Attach the intent to the widget's button.
        final PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
        views.setOnClickPendingIntent(R.id.my_button, pendingIntent);

        appWidgetManager.updateAppWidget(appWidgetId, views);
    }
}

そしてここにコードがありますMyActivity

public MyActivity() {
    Log.d(TAG, "Activity instantiated");
}

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

    // Allow this activity to appear over the lock screen.
    final Window window = getWindow();
    window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);

    setContentView(R.layout.my_activity);
}

ウィジェットのボタンを押すと、ロック解除PINの入力を求められます。アクティビティのコンストラクターのログメッセージは、PINを入力するまで表示されません。つまり、Androidは、が効果を発揮する前にPINを要求することを決定していますFLAG_SHOW_WHEN_LOCKED

画面がロックされたままアクティビティを起動することをAndroidに通知する方法はありますか?Intentたぶん私が自分のまたはに設定できるフラグPendingIntent

4

2 に答える 2

4

ブロードキャスト インテントを使用して、ウィジェット プロバイダーでリッスンし、onRecieve メソッドでアクティビティ インテントを開始できます。これにより、デバイスのロックは解除されませんが、ユーザーにロック解除を要求することなく、アクティビティをフォアグラウンドで起動します。

Intent broadcastIntent = new Intent("com.yourapp.yourbroadcast");
widget.setOnClickPendingIntent(R.id.yourButton,  
                               PendingIntent.getBroadcast(ctxt, 0, broadcastIntent, PendingIntent.FLAG_UPDATE_CURRENT));

あなたの onRecieve(Context ctx, Intent intent) で:

if (intent.getAction().equals("com.yourapp.yourbroadcast"))
{ 
       final Intent intent = new Intent(context, MyActivity.class);
       intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
       ctx.startActivity(intent) ;
}
于 2013-02-16T10:04:17.193 に答える