簡體   English   中英

如何從鎖屏啟動新活動?

[英]How to start new activity from lockscreen?

我正在為聯系人管理創建簡單的小部件,允許用戶撥打和發送短信到所需的聯系人。

它作為“普通小部件”工作正常,但當我在Android 4.2上將其添加為鎖屏小部件時,短信應用或撥號應用程序無法啟動。 其實他們明星,但“落后”鎖屏,所以用戶仍然必須手動解鎖屏幕才能撥打/發送短信。

我在網上搜索了一些解決方案,但沒有任何東西派上用場。 我知道FLAG_DISABLE_KEYGUARD或FLAG_SHOW_WHEN_LOCKED,但由於短信/撥號應用程序不是“我的”所以我不知道他們是否設置了正確的標志。 作為一種解決方法,我試圖創建我的活動,設置那些標志然后只是啟動所需的一個(撥號或短信),但這沒有幫助。

有一種解鎖屏幕的方法,但這涉及到使用KeyguardManager和KeyguardLock(工作正常),但是在使用KeyguardLock.newKeyguardLock()的結果是我最終手機無法自動轉鎖,當然因為我沒有釋放此鎖(它會導致鎖再次出現,這不是我想要的)。

事實上,這個小部件應該與鎖定屏幕上的默認短信小部件或郵件小部件一起工作?

那么,我的問題是,如何實現這一點並從鎖屏開始新的活動?

好吧,我自己找到了解決方案。 事實證明我很接近:)

要啟動第三方應用程序/活動,最簡單的解決方案是創建某種代理活動,它將在窗口上設置適當的標志,然后啟動所需的活動和完成。

示例代碼如下所示:

在widget中調用intent(調用代理):

    @Override
public void onReceive(Context context, Intent intent) {
    Utilities.printLog(TAG, "onReceive");
    Utilities.printLog(TAG, "intent: " + intent);
    if (intent.getAction().equals(ACTION)) {

        final String number = intent.getStringExtra(EXTRAS);
        Toast.makeText(context, "Selected number: " + number,
                Toast.LENGTH_SHORT)
                .show();


        /** REMOVING KEYGUARD RECEIVER **/
        // not really an option - lock is still holded by widget and screen
        // cannot be locked again ;(
        // KeyguardManager keyguardManager = (KeyguardManager) context
        // .getSystemService(Context.KEYGUARD_SERVICE);
        // KeyguardLock lock = keyguardManager
        // .newKeyguardLock(Context.KEYGUARD_SERVICE);
        // lock.disableKeyguard();

        final Intent activity = new Intent(context, MainActivity.class);
        activity.putExtras(intent.getExtras());
        activity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        activity.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
        activity.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
        context.startActivity(activity);
    }

    super.onReceive(context, intent);
}

在代理活動中只需調用:

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    // getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);

    final Intent callingIntent = getIntent();

    final String actionToLaunch = callingIntent.getStringExtra(ContactsStackWidgetProvider.ACTION);
    final String number = callingIntent.getStringExtra(ContactsStackWidgetProvider.EXTRAS);

    final Intent activity = new Intent();
    if (actionToLaunch.equals(Intent.ACTION_DIAL)) {
        activity.setAction(Intent.ACTION_DIAL);
        activity.setData(Uri.parse("tel:"+number));
    } else if (actionToLaunch.equals(Intent.ACTION_SENDTO)) {
        activity.setAction(Intent.ACTION_SENDTO);
        activity.setData(Uri.parse("sms:"+number));
    } else {
        throw new IllegalArgumentException("Unrecognized action: "
                + actionToLaunch);
    }

    new Handler().postDelayed(new Runnable() {

        @Override
        public void run() {
            startActivity(activity);
            finish();//it is important to finish, but after a small delay
        }
    }, 50L);


}

暫無
暫無

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

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