锁屏前面的特定高度的活动

时间:2013-08-10 00:02:38

标签: android android-layout lockscreen keyguard

我想在Lockscreen前面显示一个Activity。我在onCreate方法中尝试使用此代码:

super.onCreate(savedInstanceState);
Window window = getWindow();

window.addFlags(LayoutParams.FLAG_SHOW_WHEN_LOCKED);        
setContentView(R.layout.test);

这适用于在整个屏幕上显示的活动,但我想构建一个只有200px高度的活动。我以为我可以将它与这段代码相匹配:

super.onCreate(savedInstanceState);
Window window = getWindow();

LayoutParams layout = new WindowManager.LayoutParams();
layout.copyFrom(window.getAttributes());
layout.height = 200;

window.setAttributes(layout);
window.addFlags(LayoutParams.FLAG_SHOW_WHEN_LOCKED);

setContentView(R.layout.test);

但是锁定屏幕前面的活动不可见。如果我解锁手机,则直接显示活动。任何想法为什么以及如何解决这个问题?

编辑:我认为它与窗口浮动FLAG有关。如果设置了这个标志(并且我认为当我改变大小时),则活动不会显示在锁屏上。但这只是一种推定。有任何想法或解决方法来解决这个问题吗?

4 个答案:

答案 0 :(得分:0)

我在设计音乐播放器时遇到了类似的要求。我最终为锁屏小部件做的最后是:

  1. 我的锁定屏幕小部件有一个transperent背景。
  2. 在布局底部添加了一个“Click to exit to lockscreen”按钮。
  3. 为了感受盒子,在按钮周围添加了白色边界。
  4. 您可以从Google Play下载我的音乐播放器“Fusion Music Player”来查看它

答案 1 :(得分:0)

首先保存到首选项Keyguard instanse。

之后 - 在手机上以编程方式禁用默认锁屏。

然后,实现Service,当电话进入锁定状态时捕获。

SCREEN_ON检查堆栈中的活动时,如果她存在则显示她,否 - 由singleTask启动。

这是在Lockscreen上实现Activity的一种方法。因为谷歌拒绝化妆锁屏,任何操纵都是黑客的。

您可以制作小部件并将其置于锁定屏幕或以下方式。

仅供参考:google it 我对Android的锁定(来自code.google.com)

答案 2 :(得分:0)

最后我实现了同样的目标。不要去活动,因为安全原因,android不会在你的活动后面显示锁屏,所以对于服务。

以下是我服务的onStartCommand中的代码

WindowManager mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

View mView = mInflater.inflate(R.layout.score, null);

WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams(
        ViewGroup.LayoutParams.WRAP_CONTENT,
        ViewGroup.LayoutParams.WRAP_CONTENT, 0, 0,
        WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
        /* | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON */,
        PixelFormat.RGBA_8888);

mWindowManager.addView(mView, mLayoutParams);

答案 3 :(得分:-1)

您最好的选择是创建一个填充屏幕的View,但除了您想要的部分之外,其他地方都有透明背景。

这可以通过在文件res/values/styles.xml中定义自定义主题来实现(最初显示在How do I create a transparent Activity on Android?上):

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <style name="Theme.Transparent" parent="android:Theme">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:backgroundDimEnabled">false</item>
  </style>
</resources>

然后将此主题添加到Activity的清单声明中:

android:theme="@style/Theme.Transparent"

接下来,您可以通过添加此R.layout.lockscreen文件为此活动创建布局(XML)。在这里指定高度(以像素为单位):

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <FrameLayout 
        android:layout_width="match_parent"
        android:layout_height="200px"
        android:centerInParent="true" >

        <include layout="@layout/test" /> <!-- This points to your R.layout.test layout. -->

    </FrameLayout>

</RelativeLayout>

最后,只需使用上面显示的第一种方法来显示活动:

super.onCreate(savedInstanceState);
Window window = getWindow();

window.addFlags(LayoutParams.FLAG_SHOW_WHEN_LOCKED);        
setContentView(R.layout.lockscreen);