如何从锁屏启动新活动?

时间:2013-04-24 09:31:08

标签: android android-activity widget android-4.2-jelly-bean lockscreen

我正在为联系人管理创建简单的小部件,允许用户拨打和发送短信到所需的联系人。

它作为“普通小部件”工作正常,但是当我在Android 4.2上将其添加为锁屏小部件时,短信应用或拨号应用程序无法启动。 实际上他们是明星,但是“落后”锁屏,所以用户仍然必须手动解锁屏幕才能拨打/发送短信。

我在网上搜索了一些解决方案,但没有任何东西派上用场。 我知道FLAG_DISABLE_KEYGUARD或FLAG_SHOW_WHEN_LOCKED,但由于短信/拨号应用程序不是“我的”所以我不知道他们是否设置了正确的标志。 作为一种解决方法,我试图创建我的活动,设置那些标志然后只是启动所需的一个(拨号或短信),但这没有帮助。

有一种解锁屏幕的方法,但这涉及到使用KeyguardManager和KeyguardLock(工作正常),但是在使用KeyguardLock.newKeyguardLock()的结果中,我最终手机无法自动转锁,当然因为我不释放这个锁(它会导致锁再次出现,这不是我想要的)。

实际上,这个小部件应该与锁定屏幕上的默认短信小部件或邮件小部件一起工作?

所以,我的问题是,如何实现这一点并从锁屏启动新活动?

1 个答案:

答案 0 :(得分:7)

嗯,我自己找到了解决方案。事实证明我很接近:)

要启动第三方应用/活动,最简单的解决方案是创建某种代理活动,它将在窗口上设置正确的标志,然后启动所需的活动和完成。

示例代码如下所示:

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


}