当Android应用程序closures/发送到后台时运行代码
我有一个Android应用程序发送一些数据到一个web服务。 我需要发送这个数据,只要应用程序closures或发送到后台..但我该怎么做到这一点?
我目前的解决scheme是在我的家庭活动上的OnPause()上运行它,但是我需要这个来运行,无论用户在closures应用程序时使用哪个活动。这是可能的还是必须添加OnPause方法所有的活动?
编辑
这个答案只是为了一个目的,就是在onPause()
为所有活动运行一个代码。 当您的应用程序发送到后台时,它不会让您运行代码。
原始答复
创build一个名为YourBasicActivity
的活动并覆盖它的onPause()
方法并从YourBasicActivity
扩展每个活动
在决定使用下面的代码之前,先检查这个解决scheme https://stackoverflow.com/a/5862048/1037294 !
要检查您的应用程序是否发送到后台,您可以在应用程序中的每个活动onPause()
或onStop()
上调用此代码:
/** * Checks if the application is being sent in the background (ie behind * another application's Activity). * * @param context the context * @return <code>true</code> if another application will be above this one. */ public static boolean isApplicationSentToBackground(final Context context) { ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List<RunningTaskInfo> tasks = am.getRunningTasks(1); if (!tasks.isEmpty()) { ComponentName topActivity = tasks.get(0).topActivity; if (!topActivity.getPackageName().equals(context.getPackageName())) { return true; } } return false; }
为了这个工作,你应该把它包含在你的AndroidManifest.xml
<uses-permission android:name="android.permission.GET_TASKS" />
这是我使用的方法,它似乎工作得很好:
我有我自己的顶级应用程序类,这扩展了应用程序
public class MyApplication extends Application implements Application.ActivityLifecycleCallbacks {
您还需要在清单文件中注册这个Application对象:
<application android:label="@string/app_name" android:icon="@drawable/ic_launcher" android:name=".MyApplication">
注意我也是如何实现ActivityLifeCycleCallbacks接口的。 这个接口有以下几种方法:
public static interface ActivityLifecycleCallbacks { void onActivityCreated(android.app.Activity activity, android.os.Bundle bundle); void onActivityStarted(android.app.Activity activity); void onActivityResumed(android.app.Activity activity); void onActivityPaused(android.app.Activity activity); void onActivityStopped(android.app.Activity activity); void onActivitySaveInstanceState(android.app.Activity activity, android.os.Bundle bundle); void onActivityDestroyed(android.app.Activity activity); }
您需要实现这些方法,然后在应用程序onCreate()中注册这些事件,如下所示
@Override public void onCreate() { super.onCreate(); registerActivityLifecycleCallbacks(this); }
然后,只要发生一个活动生命周期方法,例如onCreate(),onPause等,就会调用callback函数(MyApplication对象)。在onActivityPaused()中,你可以通过调用@peceps方法来检查应用是否是后台的:isApplicationSentToBackground …)
这是我的代码看起来像然后…
/** * Application.ActivityLifecycleCallbacks methods */ @Override public void onActivityCreated(Activity activity, Bundle bundle) { } @Override public void onActivityStarted(Activity activity) { } @Override public void onActivityResumed(Activity activity) { } @Override public void onActivityStopped(Activity activity) { try { boolean foreground = new ForegroundCheckTask().execute(getApplicationContext()).get(); if(!foreground) { //App is in Background - do what you want } } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } @Override public void onActivityPaused(Activity activity) { } @Override public void onActivitySaveInstanceState(Activity activity, Bundle bundle) { } @Override public void onActivityDestroyed(Activity activity) { }
创build一个新的类去执行前台检查(这是一个asynchronous任务)。 请参阅检查Android应用程序是否在前台? 为更多。
class ForegroundCheckTask extends AsyncTask<Context, Void, Boolean> { @Override protected Boolean doInBackground(Context... params) { final Context context = params[0]; return isAppOnForeground(context); } private boolean isAppOnForeground(Context context) { ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses(); if (appProcesses == null) { return false; } final String packageName = context.getPackageName(); for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) { if (appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND && appProcess.processName.equals(packageName)) { return true; } } return false; } }
也许这可能是有帮助的,告诉我,如果它为你工作。 只有当你从后台返回时,活动的值将是0(零),其余的时间将是一个数字高于0(零)时,onRestart()执行。
public class FatherClass extends Activity { private static int activities = 0; public void onCreate(Bundle savedInstanceState, String clase) { super.onCreate(savedInstanceState); } protected void onRestart() { super.onRestart(); if(activities == 0){ Log.i("APP","BACK FROM BACKGROUND"); } } protected void onStop(){ super.onStop(); activities = activities - 1; } protected void onStart(){ super.onStart(); activities = activities + 1; } }
所有的课程必须从这个课程延伸到这个工作。
说明 : onStart被执行一个活动是“可见的”和onStop当活动是“不可见的”。 所以当你的APP(它表示APP不活动)进入后台时,所有的活动都是“不可见的”,所以他们执行onStop方法,所以这个想法背后是每次活动开始时添加一个,每次减less一个所以如果variables“activities”的值为零,则意味着在某个点开始的所有活动现在都不可见,所以当您从后台返回APP并对活动执行onRestart方法时“front”可以检查是否来自后台或者只是重新启动一个活动。
重写Home活动的onStop()
方法,并在那里运行代码。
我认为你需要运行你自己的线程,这将检查所有正在运行的活动在后台或销毁。
MyBasicActivity extends Activity { private static ArrayList<MyBasicActivity> activities=new ArrayList<MyBasicActivities); private boolean started; public void onCreate() { activities.add(this); } public void onDestroy() { activities.remove(this); } public void onStart() { this.started=true; } public void onPause() { this.started=false; } public boolean isStarted() { return started; } } MyThread implements Runnable { private ArrayList<MyBasicActivity> activities; public MyThread(ArrayList<MyBasicActivity> activities) { this.activities=activities; } void run() { while(!stopped) { boolean inBackground=true; for(MyBasicActivity activity:activities) { if(activity.isStarted()) { inBackground=false; break; } } if(inBackground) //run your code here; sleep(10000); //10 secs } } }