Android Facebook lock screen notification
Actually, ferdy182
was/is onto something.
Here's what I got using the android.permission.SYSTEM_ALERT_WINDOW
:
So, I couldn't do this with an Activity
. It just wouldn't work. I had to implement a Service
which added a View
using the WindowManager
.
One possible workflow would be: a broadcast is received by your BroadcastReceiver
=> it starts a Service => the Service adds the required view.
Now, the code (the comments explain a few things):
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); } }}
And finally, add the permission to your app's manifest:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
I think it is probably using the same trick as the Chat heads bubbles for Messenger.
Basically you use this permission"android.permission.SYSTEM_ALERT_WINDOW"to display your views above other apps.
I haven't tried myself but I am pretty sure they used this.
From the docs "Allows an application to open windows using the type TYPE_SYSTEM_ALERT, shown on top of all other applications. "http://developer.android.com/reference/android/Manifest.permission.html#SYSTEM_ALERT_WINDOW