在最新版本的 Android 应用上,Facebook 显示了锁屏通知功能,如下图所示:
有没有人尝试实现这个?
我知道在锁定屏幕上显示 Activity 很简单,但不幸的是它不适用于半透明背景。基本上它可以工作,但在我们的 Activity 下方,我们看到的是启动器屏幕,而不是锁定屏幕(在这种情况下,锁定屏幕也是透明的)。
我现在尝试的是:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
在我的 Activity 中。
我也试过这个例子:https://gist.github.com/daichan4649/5352944
正如我所描述的 - 一切正常,但没有透明度。
根据我的观察 Facebook 使用主题:
@android:style/Theme.Translucent.NoTitleBar
并且没有权限:
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
我还注意到锁屏通知需要触摸,因此我们无法通过手势显示来自状态栏的通知。
关于如何在 Android L 发布之前创建这种通知的任何想法。
最佳答案
实际上,ferdy182
曾经/正在做某事。
这是我使用 android.permission.SYSTEM_ALERT_WINDOW
得到的结果:
所以,我不能用 Activity
来做到这一点。它只是行不通。我必须实现一个Service
,它使用WindowManager
添加了一个View
。
一个可能的工作流程是:BroadcastReceiver
接收到广播 => 它启动一个服务 => 服务添加所需的 View 。
现在,代码(注释解释了一些事情):
public class MyService extends Service {
View mView;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
// instance of WindowManager
WindowManager mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
LayoutInflater mInflater = (LayoutInflater)
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// inflate required layout file
mView = mInflater.inflate(R.layout.abc, null);
// attach OnClickListener
mView.findViewById(R.id.some_id).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// you can fire an Intent accordingly - to deal with the click event
// stop the service - this also removes `mView` from the window
// because onDestroy() is called - that's where we remove `mView`
stopSelf();
}
});
// the LayoutParams for `mView`
// main attraction here is `TYPE_SYSTEM_ERROR`
// as you noted above, `TYPE_SYSTEM_ALERT` does not work on the lockscreen
// `TYPE_SYSTEM_OVERLAY` works very well but is focusable - no click events
// `TYPE_SYSTEM_ERROR` supports all these requirements
WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT, 0, 0,
WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
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);
// finally, add the view to window
mWindowManager.addView(mView, mLayoutParams);
}
@Override
public void onDestroy() {
super.onDestroy();
// remove `mView` from the window
removeViewFromWindow();
}
// Removes `mView` from the window
public void removeNow() {
if (mView != null) {
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
wm.removeView(mView);
}
}
}
最后,将权限添加到应用的 list 中:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
关于Android Facebook 锁屏通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24921241/