簡體   English   中英

如何在沒有解鎖的情況下從鎖屏小部件啟動活動?

[英]How to launch an activity from a lockscreen widget, without unlocking?

我在鎖屏小部件上有一個按鈕,我想要按下按鈕來按下時啟動一個活動。 如果屏幕被鎖定,我希望活動顯示在鎖定屏幕上,而無需用戶輸入PIN或模式或其他任何內容,並且當用戶離開活動時鎖屏應重新出現。

我知道WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED ,如果我使用從ADB shell am start手動啟動它,我的活動確實出現在鎖屏上。 問題是,當我按下小部件中的按鈕時,它會讓我在創建活動之前輸入解鎖PIN。

我在我的widget提供程序中有這個代碼:

@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在FLAG_SHOW_WHEN_LOCKED可能產生任何影響之前決定請求該引腳。

有沒有辦法告訴Android我想在屏幕仍然鎖定時啟動活動? 也許我可以在我的IntentPendingIntent上設置一個標志?

您可以使用廣播意圖並在窗口小部件提供程序中偵聽它,然后在onRecieve方法上啟動活動意圖,這將不會解鎖您的設備,但會在前台啟動您的活動而無需請求用戶解鎖。

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

在你的onRecieve(上下文ctx,意圖意圖):

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) ;
}

在你的清單中:

<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>

你的Widgetclass:

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...
}

確保將活動中的Widow-Flag設置為FLAG_SHOW_WHEN_LOCKED,而不是FLAG_DISMISS_KEYGUARD以保持屏幕鎖定。 此示例將通過單擊窗口小部件來啟動活動。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM