In this example detecting current running activity from top of the activity stack. In this way we can find out current running application and task.
1. Suppose you have a task like , when user opens message/phone call/any application screen then your app performs an action like start a music or vibration etc....
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.checkcurrentrunningapplication" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.checkcurrentrunningapplication.Main" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name=".StartupReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="StartupReceiver_Manual_Start" /> </intent-filter> </receiver> <receiver android:name = ".CheckRunningApplicationReceiver"/> </application> <uses-permission android:name="android.permission.GET_TASKS" /> </manifest>
Inside This class Start Broadcast reciever to check current running activity/task/application.
package com.example.checkcurrentrunningapplication; import android.os.Bundle; import android.app.Activity; import android.content.Intent; public class Main extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Start broadcast receiver may be StartupReceiver not started on BOOT_COMPLETED // Check AndroidManifest.xml file initialize(); } private void initialize() { // Start receiver with the name StartupReceiver_Manual_Start // Check AndroidManifest.xml file getBaseContext().getApplicationContext().sendBroadcast( new Intent("StartupReceiver_Manual_Start")); } }
This receiver will on phone boot time (see AndroidMainifest.xml). Creating alarm that will call broadcast receiver CheckRunningApplicationReceiver.class after each 5 seconds.
package com.example.checkcurrentrunningapplication; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.SystemClock; import android.util.Log; public class StartupReceiver extends BroadcastReceiver { static final String TAG = "SR"; final int startupID = 1111111; @Override public void onReceive(Context context, Intent intent) { // Create AlarmManager from System Services final AlarmManager alarmManager = (AlarmManager) context .getSystemService(Context.ALARM_SERVICE); try{ // Create pending intent for CheckRunningApplicationReceiver.class // it will call after each 5 seconds Intent i7 = new Intent(context, CheckRunningApplicationReceiver.class); PendingIntent ServiceManagementIntent = PendingIntent.getBroadcast(context, startupID, i7, 0); alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(), 5000, ServiceManagementIntent); } catch (Exception e) { Log.i(TAG, "Exception : "+e); } } }
This broadcast receiver will call after each 5 seconds and check CALL/SMS/THIS example screen is open or not. if CALL/SMS/THIS example screen open then show alert message on screen.
package com.example.checkcurrentrunningapplication; import java.util.List; import android.app.ActivityManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; import android.widget.Toast; public class CheckRunningApplicationReceiver extends BroadcastReceiver { public final String TAG = "CRAR"; // CheckRunningApplicationReceiver @Override public void onReceive(Context aContext, Intent anIntent) { try { // Using ACTIVITY_SERVICE with getSystemService(String) // to retrieve a ActivityManager for interacting with the global system state. ActivityManager am = (ActivityManager) aContext .getSystemService(Context.ACTIVITY_SERVICE); // Return a list of the tasks that are currently running, // with the most recent being first and older ones after in order. // Taken 1 inside getRunningTasks method means want to take only // top activity from stack and forgot the olders. List<ActivityManager.RunningTaskInfo> alltasks = am .getRunningTasks(1); // for (ActivityManager.RunningTaskInfo aTask : alltasks) { // Used to check for CALL screen if (aTask.topActivity.getClassName().equals("com.android.phone.InCallScreen") || aTask.topActivity.getClassName().equals("com.android.contacts.DialtactsActivity")) { // When user on call screen show a alert message Toast.makeText(aContext, "Phone Call Screen.", Toast.LENGTH_LONG).show(); } // Used to check for SMS screen if (aTask.topActivity.getClassName().equals("com.android.mms.ui.ConversationList") || aTask.topActivity.getClassName().equals("com.android.mms.ui.ComposeMessageActivity")) { // When user on Send SMS screen show a alert message Toast.makeText(aContext, "Send SMS Screen.", Toast.LENGTH_LONG).show(); } // Used to check for CURRENT example main screen String packageName = "com.example.checkcurrentrunningapplication"; if (aTask.topActivity.getClassName().equals( packageName + ".Main")) { // When opens this example screen then show a alert message Toast.makeText(aContext, "Check Current Running Application Example Screen.", Toast.LENGTH_LONG).show(); } // These are showing current running activity in logcat with // the use of different methods Log.i(TAG, "==============================="); Log.i(TAG, "aTask.baseActivity: " + aTask.baseActivity.flattenToShortString()); Log.i(TAG, "aTask.baseActivity: " + aTask.baseActivity.getClassName()); Log.i(TAG, "aTask.topActivity: " + aTask.topActivity.flattenToShortString()); Log.i(TAG, "aTask.topActivity: " + aTask.topActivity.getClassName()); Log.i(TAG, "==============================="); } } catch (Throwable t) { Log.i(TAG, "Throwable caught: " + t.getMessage(), t); } } }
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".Main" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="Starting broadcast reciever to check current running tasks." /> </RelativeLayout>