Intereting Posts
Как долго приложение может быть одобрено для Amazon AppStore? Как установить фиксированное количество строк в android gridView? Как создать плавный навигационный ящик Пользовательский вид панели действий Android: установите цвет CheckBox Кинжал – android.app.IntentService с @Inject Как отобразить маршрут между двумя геокоординатами на картах Google? Считыватель штрих-кодов / Qr для Android Я не вижу Java SDK javadoc в Eclipse Android управляет несколькими экранами … (Относительная компоновка или линейная компоновка)? Повернуть (повернуть) положение маркера в зависимости от направления по маршруту Как я могу выделить строку таблицы при нажатии? ActionBar Совместимость ActionBarActivity setTitle не работает в Android 2.X Использует библиотеку событий, такую ​​как Otto или EventBus, рекомендуемый способ обработки отношений между действиями, фрагментами и фоновыми потоками Сканирование штрих-кода ручкой через Android-устройство

Автоматически регистрировать события жизненного цикла Android с помощью ActivityLifecycleCallbacks?

Я пытаюсь автоматически захватывать и регистрировать события жизненного цикла Android с помощью ActivityLifecycleCallbacks, однако документация по этому вопросу, по меньшей мере, недостаточна:

public void registerActivityLifecycleCallbacks (Application.ActivityLifecycleCallbacks callback) 

Я не хочу расширять класс Activity или переопределять существующие методы жизненного цикла (onCreate, onResume и т. Д.). Я ищу, чтобы у вас был отдельный класс, слушающий эти события и действующий соответственно.

Кто-нибудь имеет какой-либо опыт в этом или имеет ссылки на хорошую документацию или учебники о том, как это работает? В частности, как зарегистрироваться для ActivityLifecycleCallbacks и как их обрабатывать?

Solutions Collecting From Web of "Автоматически регистрировать события жизненного цикла Android с помощью ActivityLifecycleCallbacks?"

Я выполнил собственную реализацию Application.ActivityLifecycleCallbacks . Я использую SherlockActivity , но для нормального класса Activity может работать.

Во-первых, я создаю интерфейс, который имеет все методы для отслеживания жизненного цикла действий:

 public interface ActivityLifecycleCallbacks{ public void onActivityStopped(Activity activity); public void onActivityStarted(Activity activity); public void onActivitySaveInstanceState(Activity activity, Bundle outState); public void onActivityResumed(Activity activity); public void onActivityPaused(Activity activity); public void onActivityDestroyed(Activity activity); public void onActivityCreated(Activity activity, Bundle savedInstanceState); } 

Во-вторых, я реализовал этот интерфейс в классе приложения:

 public class MyApplication extends Application implements my.package.ActivityLifecycleCallbacks{ @Override public void onCreate() { super.onCreate(); } @Override public void onActivityStopped(Activity activity) { Log.i("Tracking Activity Stopped", activity.getLocalClassName()); } @Override public void onActivityStarted(Activity activity) { Log.i("Tracking Activity Started", activity.getLocalClassName()); } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { Log.i("Tracking Activity SaveInstanceState", activity.getLocalClassName()); } @Override public void onActivityResumed(Activity activity) { Log.i("Tracking Activity Resumed", activity.getLocalClassName()); } @Override public void onActivityPaused(Activity activity) { Log.i("Tracking Activity Paused", activity.getLocalClassName()); } @Override public void onActivityDestroyed(Activity activity) { Log.i("Tracking Activity Destroyed", activity.getLocalClassName()); } @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { Log.i("Tracking Activity Created", activity.getLocalClassName()); } } 

В-третьих, я создаю класс, который простирается от SherlockActivity:

 public class MySherlockActivity extends SherlockActivity { protected MyApplication nMyApplication; protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); nMyApplication = (MyApplication) getApplication(); nMyApplication.onActivityCreated(this, savedInstanceState); } protected void onResume() { // TODO Auto-generated method stub nMyApplication.onActivityResumed(this); super.onResume(); } @Override protected void onPause() { // TODO Auto-generated method stub nMyApplication.onActivityPaused(this); super.onPause(); } @Override protected void onDestroy() { // TODO Auto-generated method stub nMyApplication.onActivityDestroyed(this); super.onDestroy(); } @Override protected void onStart() { nMyApplication.onActivityStarted(this); super.onStart(); } @Override protected void onStop() { nMyApplication.onActivityStopped(this); super.onStop(); } @Override protected void onSaveInstanceState(Bundle outState) { nMyApplication.onActivitySaveInstanceState(this, outState); super.onSaveInstanceState(outState); } } 

В-четвертых, все классы, которые простираются от SherlockActivity, я заменил для MySherlockActivity:

 public class MainActivity extends MySherlockActivity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } } 

Теперь в logcat вы увидите журналы, запрограммированные в реализации интерфейса, выполненные в MyApplication.

ОБНОВИТЬ

Эта реализация была протестирована с уровня API 9 (Gingerbread), уровня API 12 (Honeycomb) и уровня API 17 (Jelly Bean) и отлично работает. Может работать в старых версиях Android.

У меня нет опыта на собственном опыте, но, судя по API, вы можете просто написать свой собственный класс, который реализует интерфейс Application.ActivityLifecycleCallbacks и регистрирует этот класс на предоставленном экземпляре класса Application

 getApplicaton().registerActivityLifecycleCallbacks(yourCustomClass); 

Этот класс получит те же обратные вызовы, что и ваши индивидуальные действия. Удачи.

PS. Это API-уровень 14 битв, поэтому он не будет работать на старых телефонах.

Попробуйте следующее: http://engineering.meetme.com/2015/04/android-determine-when-app-is-opened-or-closed/#comment-202

Он предлагает AppForegroundStateManager к которому каждое действие сообщает через его функции onStop() и onStart() как это:

 @Override protected void onStart() { super.onStart(); AppForegroundStateManager.getInstance().onActivityVisible(this); } @Override protected void onStop() { AppForegroundStateManager.getInstance().onActivityNotVisible(this); super.onStop(); } 

Класс Application реализует прослушиватель следующим образом:

 public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); AppForegroundStateManager.getInstance().addListener(this); } @Override public void onAppForegroundStateChange(AppForegroundStateManager.AppForegroundState newState) { if (AppForegroundStateManager.AppForegroundState.IN_FOREGROUND.equals(newState)) { // App just entered the foreground. Do something here! Log.i(TAG, "App Just Entered the Foreground with launch mechanism of: " + mLaunchMechanism); } else { // App just entered the background. Set our launch mode back to the default of direct. mLaunchMechanism = LaunchMechanism.DIRECT; } } } 

Он также содержит советы и рекомендации для определения способа открытия приложения – извещения, URL-адреса, открывающего ваше приложение или непосредственно из меню «Службы». Это делается с помощью Enum в классе Application:

 public enum LaunchMechanism { DIRECT, NOTIFICATION, URL, BACKGROUND } private LaunchMechanism mLaunchMechanism = LaunchMechanism.DIRECT; public void setLaunchMechanism(LaunchMechanism launchMechanism) { mLaunchMechanism = launchMechanism; } 

В нашей реализации мы имеем флаги, когда мы начинаем действие, которое запускает стороннее действие, например, если пользователь делает телефонный звонок из нашего приложения или запускается браузер. В операции onStop() запускающей активности мы делаем проверку как это, чтобы сообщать о onStop() активности, когда эти флаги являются ложными:

 if(!flag_userLaunchedThirdPartyActivity){ AppForegroundStateManager.getInstance().onActivityNotVisible(this); } 

Для проверки того, идет ли приложение в фоновом режиме – например, когда экран устройства становится темным или пользователь получает телефонный звонок – он работает следующим образом:

 public static boolean isApplicationGoingToBackground(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())) { setLaunchMechanism(LaunchMechanism.BACKGROUND); return true; } } setLaunchMechanism(LaunchMechanism.DIRECT); return false; } 

Это решение не зависит от уровня API, поэтому он должен полностью вернуться к уровню API 1.