There have been multiple accounts created with the sole purpose of posting advertisement posts or replies containing unsolicited advertising.

Accounts which solely post advertisements, or persistently post them may be terminated.

How to start an overlay activity over *other* apps?

I have an Android app which needs to run an overlay activity with some content in it over other apps on the phone at the moment they start or get focused. For this, I use AccessiblityService:


<span style="color:#323232;">    override fun onAccessibilityEvent(event: AccessibilityEvent) {
</span><span style="color:#323232;">        if (event.eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
</span><span style="color:#323232;">           if (cond1) {
</span><span style="color:#323232;">              
</span><span style="color:#323232;">              // (!)
</span><span style="color:#323232;">              // this will get triggered properly
</span><span style="color:#323232;">              //
</span><span style="color:#323232;">
</span><span style="color:#323232;">             val intent = Intent(this, MyOverlayActivity::class.java)
</span><span style="color:#323232;">             intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
</span><span style="color:#323232;">
</span><span style="color:#323232;">
</span><span style="color:#323232;">             startActivity(intent)
</span><span style="color:#323232;">           }
</span><span style="color:#323232;">        }
</span><span style="color:#323232;">    }
</span><span style="color:#323232;">
</span>

However, it’ll only get launched properly whenever I switch to my own activity - MainActivity.

What’s the matter?

MyOverlayActivity:


<span style="color:#323232;">    class MyOverlayActivity : AppCompatActivity() {
</span><span style="color:#323232;">        override fun onCreate(savedInstanceState: Bundle?) {
</span><span style="color:#323232;">            super.onCreate(savedInstanceState)
</span><span style="color:#323232;">
</span><span style="color:#323232;">            // 1
</span><span style="color:#323232;">    //        window.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY)
</span><span style="color:#323232;">    //        val layoutParams = WindowManager.LayoutParams(
</span><span style="color:#323232;">    //            WindowManager.LayoutParams.MATCH_PARENT,
</span><span style="color:#323232;">    //            WindowManager.LayoutParams.MATCH_PARENT,
</span><span style="color:#323232;">    //            WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
</span><span style="color:#323232;">    //            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
</span><span style="color:#323232;">    //            PixelFormat.TRANSLUCENT
</span><span style="color:#323232;">    //        )
</span><span style="color:#323232;">    //        window.attributes = layoutParams
</span><span style="color:#323232;">            //
</span><span style="color:#323232;">
</span><span style="color:#323232;">
</span><span style="color:#323232;">
</span><span style="color:#323232;">            // 2
</span><span style="color:#323232;">            window.setFlags(
</span><span style="color:#323232;">                WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
</span><span style="color:#323232;">                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
</span><span style="color:#323232;">            )
</span><span style="color:#323232;">            window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)
</span><span style="color:#323232;">            window.setLayout(
</span><span style="color:#323232;">                WindowManager.LayoutParams.MATCH_PARENT,
</span><span style="color:#323232;">                WindowManager.LayoutParams.MATCH_PARENT
</span><span style="color:#323232;">            )
</span><span style="color:#323232;">            window.setGravity(Gravity.BOTTOM)
</span><span style="color:#323232;">            //
</span><span style="color:#323232;">
</span><span style="color:#323232;">
</span><span style="color:#323232;">            setContentView(R.layout.activity_my_overlay_layout)
</span><span style="color:#323232;">        }
</span><span style="color:#323232;">    }
</span>

Manifest


<span style="color:#323232;">
</span><span style="color:#323232;">    <!-- [.............] -->
</span><span style="color:#323232;">    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
</span><span style="color:#323232;">    <!-- [.............] -->
</span><span style="color:#323232;">
</span><span style="color:#323232;">    <activity android:name=".MyOverlayActivity"
</span><span style="color:#323232;">        android:exported="true"
</span><span style="color:#323232;">        android:theme="@style/AppTheme.TranslucentNoTitleBarFullscreen"
</span><span style="color:#323232;">        android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|keyboardHidden|keyboard|navigation">
</span><span style="color:#323232;">    </activity>
</span><span style="color:#323232;">
</span>

Note I’ve given the permission required to my app in Acessibility.

  • All
  • Subscribed
  • Moderated
  • Favorites
  • random
  • [email protected]
  • lifeLocal
  • goranko
  • All magazines