I would like to launch an intent when any of my activity is visible, otherwise I will put it up as a notification, and will be fired by the user.
To decide this, I need to know if any of my activity is front-most, ho开发者_如何学JAVAw do I that?
I don't know that there's a method to get the currently displayed activity, but you could do something combining the Activity Lifecycle and a flag.
For the flag, if you've extended the Application class, that's probably a decent place to store it. For extending the application class, the top answer to this question has info. (d).
So probably keep track of the current active activity (or a flag that the activity is visible) in onResume/onPause or onStart/onStop depending on exactly what behavior you want.
Since you have multiple activities, you'll need a centroid place for storing the flag, which is why the Application makes sense. You can get the custom Application object by casting the application context (e.g. ((MyApplication)getApplicationContext()).isMyActivityActive).
You could extend Activity as well to help keep this code clean and contained.
If you're using a service you could bind to the service in every activity in the onStart/onStop (or onResume/onPause). If bound, you're visible.
You can ask for the running tasks from ActivityManager:
ActivityManager activityManager = (ActivityManager)getContext()
.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> runningTasks = activityManager.getRunningTasks(Integer.MAX_VALUE));
From API docs:
Return a list of the tasks that are currently running, with the most recent being first and older ones after in order.
So the first item on the list is the frontmost activity.
onResume()
called && onPause()
not called = visible.
Have a public static Activity currentlyVisible;
in your Application
subclass that will be updated by your activities (set to the instance in onResume()
and null
ed in onPause()
). Or invent a less ugly variant of a registry.
You could use onWindowFocusChanged(boolean hasFocus) place this in a superclass of your activities to launch the intent if it has focus.
Instead of using Activity manager there is a simple trick which you can do through code. If you observe the activity cycle closely, the flow between two activities and foreground to background is as follows. Suppose A and B are two activities.
When transition from A to B: 1. onPause() of A is called 2. onResume() of B is called 3. onStop() of A is called when B is fully resumed
When app goes into background: 1. onPause() of A is called 2. onStop() of A is called
You can detect your background event by simply putting a flag in activity.
Make an abstract activity and extend it from your other activities, so that you wont have to copy paste the code for all other activities wherever you need background event.
In abstract activity create flag isAppInBackground.
In onCreate() method: isAppInBackground = false;
In onPause() method: isAppInBackground = false;
In onStop() method: isAppInBackground = true;
You just to need to check in your onResume() if isAppInBackground is true. n after you check your flag then again set isAppInBackground = false
For transition between two activities since onSTop() of first will always called after second actvity resumes, flag will never be true and when app is in background, onStop() of activity will be called immediately after onPause and hence the flag will be true when you open the app later on.
精彩评论