Activity pops up on incoming call screen

I am trying to redefine the screen of an incoming call - I know that I cannot change it, so I am trying to pop up in ontop mode.

My code works fine if the phone does not work for several minutes.

My code is:

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8" ?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myfirstapp" android:versionCode="7" android:versionName="7"> <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="10"></uses-sdk> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.MODIFY_PHONE_STATE"/> <uses-permission android:name="android.permission.CALL_PHONE" /> <application android:label="@string/app_name" android:icon="@drawable/ic_launcher"> <receiver android:name=".MyPhoneBroadcastReceiver" android:enabled="true"> <intent-filter android:priority="99999"> <action android:name="android.intent.action.PHONE_STATE" /> </intent-filter> </receiver> <activity android:name=".Call" > </activity> </application> </manifest> 

MyPhoneBroadcastReceiver.java:

 public class MyPhoneBroadcastReceiver extends BroadcastReceiver{ public void onReceive(final Context context, Intent intent) { Thread pageTimer = new Thread(){ public void run(){ try{ sleep(700); } catch (InterruptedException e){ e.printStackTrace(); } finally { Intent i = new Intent(); i.setClass(context, Call.class); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); i.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); i.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); i.putExtra("INCOMING_NUMBER", incomingNumber); i.setAction(Intent.ACTION_MAIN); i.addCategory(Intent.CATEGORY_LAUNCHER); context.startActivity(i); } } }; pageTimer.start(); } } 

Call.java:

 package com.example.myfirstapp; import android.app.Activity; import android.os.Bundle; public class Call extends Activity{ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow(). addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); getWindow().addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); getWindow().addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); setContentView(R.layout.main); } } 

BTW - I tried to wait until the screen wakes up before bedtime (700) and it doesn’t help (in MyPhoneBroadcastReceiver.java)

 ... try { if (pm.isScreenOn()) { sleep(700); } else { while (!pm.isScreenOn()) { // Do nothing... } sleep(700); } } ... 
+6
android
source share
1 answer

When the phone screen is off and there is an incoming call, there is even more work (waking up, dealing with the keyguard view ...), so the activity in the call takes longer to display, and this leads to the case when your call activity begins before the call activity starts → the activity in the call is at the top
The exact time that is required to work in a call does not exist (you have tried and see that 700 milliseconds is not enough)

My solution: track call activity status:

  • If it’s still on top and the user doesn’t reject it (or any condition for dismissing it), just continue tracking using the handler
  • If there are other actions, go to the foreground, then activate the Call function, try to return to the top

My activity:

 public class MainActivity extends Activity { private ActivityManager mActivityManager; private boolean mDismissed = false; private static final int MSG_ID_CHECK_TOP_ACTIVITY = 1; private static final long DELAY_INTERVAL = 100; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Window window = getWindow(); window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); mHandler.sendEmptyMessageDelayed(MSG_ID_CHECK_TOP_ACTIVITY, DELAY_INTERVAL); } private Handler mHandler = new Handler() { public void handleMessage(android.os.Message msg) { if (msg.what == MSG_ID_CHECK_TOP_ACTIVITY && !mDismissed) { List<RunningTaskInfo> tasks = mActivityManager .getRunningTasks(1); String topActivityName = tasks.get(0).topActivity .getClassName(); if (!topActivityName.equals(MainActivity.this .getComponentName().getClassName())) { // Try to show on top until user dismiss this activity Intent i = new Intent(); i.setClass(MainActivity.this, MainActivity.class); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); i.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); startActivity(i); } sendEmptyMessageDelayed(MSG_ID_CHECK_TOP_ACTIVITY, DELAY_INTERVAL); } }; }; } 
+5
source share

All Articles