4

我想在锁屏前显示一个活动。我在我的 onCreate 方法中尝试使用此代码:

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

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

这对于在整个屏幕上显示的活动非常有用,但我想构建一个只有 200 像素高的活动。我想我可以用这段代码匹配它:

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

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

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

4

4 回答 4

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);
于 2014-05-21T10:35:15.760 回答
0

在设计我的音乐播放器时,我也有类似的要求。我最终为我的锁屏小部件做的是:

  1. 我的锁屏小部件有一个透明的背景。
  2. 在布局底部添加了一个按钮“单击以退出锁屏”。
  3. 为了给人一种盒子的感觉,在按钮周围添加了一个白色边界。

您可以通过从 Google Play 下载我的音乐播放器“Fusion Music Player”来查看它

于 2013-08-20T02:33:30.160 回答
0

首先保存到偏好Keyguard实例。

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

然后,实现Service手机进入锁定状态时的捕捉。

SCREEN_ON检查堆栈中的 Activity 时,如果她存在,则显示她,NO - 由 .launch 启动singleTask

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

您可以制作小部件并将他置于锁屏或以下书写方式。

仅供参考:google it my lock for android (Source on code.google.com)

于 2013-08-20T15:48:08.690 回答
-1

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

这可以通过在文件中定义自定义主题来完成res/values/styles.xml(最初显示在How do I create an 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来为此 Activity创建布局 ( )。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>

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

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

window.addFlags(LayoutParams.FLAG_SHOW_WHEN_LOCKED);        
setContentView(R.layout.lockscreen);
于 2013-08-19T13:33:54.520 回答