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