4

我在锁屏小部件上有一个按钮,我希望该按钮在按下时启动一个活动。如果屏幕被锁定,我希望活动出现在锁定屏幕上,而用户无需输入 PIN 或图案或其他任何内容,并且当用户离开活动时,锁定屏幕应该重新出现。

我知道,如果我从 ADB shell手动启动它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 产生任何效果之前要求输入PIN FLAG_SHOW_WHEN_LOCKED

有没有办法告诉Android我想在屏幕仍然锁定时启动活动?也许我可以在我的Intentor上设置一个标志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 回答
0

在您的清单中:

<receiver
        android:name=".YourWidget"
        android:label="Your Widget description" >
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            <action android:name="com.yourpackage.widgetbroadcast" />
        </intent-filter>
        <meta-data
            android:name="android.appwidget.provider"
            android:resource="@xml/wisget_yourwidget" />
</receiver>

你的小部件类:

public class YourWidget extends AppWidgetProvider {
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        for (int i = 0; i < appWidgetIds.length; i++) {
            int appWidgetId = appWidgetIds[i];      
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
            Intent intent = new Intent("com.yourpackage.widgetbroadcast");
            PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
            views.setOnClickPendingIntent(R.id.widget_yourlayout, pendingIntent);
            appWidgetManager.updateAppWidget(appWidgetId, views);
        }
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);
        if (intent.getAction().equals("com.yourpackage.widgetbroadcast")) {
            Intent intentStart = new Intent(context, MainActivity.class);           
            intentStart.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intentStart);
        }
    }
}

在您的 MainActivity 中:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);        
    Window w = getWindow();
    w.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
    //Your code...
}

确保将活动中的寡妇标志设置为 FLAG_SHOW_WHEN_LOCKED 而不是 FLAG_DISMISS_KEYGUARD 以保持屏幕锁定。此示例将通过单击小部件来启动活动。

于 2014-07-06T19:18:18.270 回答