ActivityLifecycleCallbacksを使用して、Androidライフサイクルイベントを自動的にキャプチャしてログに記録しようとしていますが、控えめに言っても、この問題に関するドキュメントはほとんどありません。
public void registerActivityLifecycleCallbacks (Application.ActivityLifecycleCallbacks callback)
Activityクラスを拡張したり、既存のライフサイクルメソッド(onCreate、onResumeなど)をオーバーライドする必要はありません。これらのイベントをリッスンし、それに応じて動作する別のクラスを探しています。
誰もこれに経験がありますか、またはこれがどのように機能するかに関する優れたドキュメントやチュートリアルへのリンクがありますか?具体的には、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());
}
}
3番目に、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
super.onResume();
nMyApplication.onActivityResumed(this);
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
nMyApplication.onActivityPaused(this);
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
nMyApplication.onActivityDestroyed(this);
}
@Override
protected void onStart() {
super.onStart();
nMyApplication.onActivityStarted(this);
}
@Override
protected void onStop() {
super.onStop();
nMyApplication.onActivityStopped(this);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
nMyApplication.onActivitySaveInstanceState(this, outState);
}
}
4番目に、SherlockActivityから拡張されるすべてのクラスを、MySherlockActivityに置き換えました。
public class MainActivity extends MySherlockActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
これで、logcatに、MyApplicationで作成されたInterface実装でプログラムされたログが表示されます。
[〜#〜] update [〜#〜]
この実装は、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
次のようなonStop()
およびonStart()
関数を介して各アクティビティが報告するAppForegroundStateManager
を提案します。
_@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から、またはアプリメニューから直接、アプリがどのように開かれたかを判断するためのヒントとコツも含まれています。これは、ApplicationクラスのEnum
を介して行われます。
_public enum LaunchMechanism {
DIRECT,
NOTIFICATION,
URL,
BACKGROUND
}
private LaunchMechanism mLaunchMechanism = LaunchMechanism.DIRECT;
public void setLaunchMechanism(LaunchMechanism launchMechanism) {
mLaunchMechanism = launchMechanism;
}
_
この実装では、ユーザーがアプリから電話をかけたりブラウザが起動した場合など、サードパーティのアクティビティを起動するアクティビティを開始するためのフラグがあります。起動アクティビティのonStop()
では、次のようなチェックを行い、これらのフラグがfalseの場合のみアクティビティの非可視性を報告します。
_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に戻るまで動作します。
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(MyApplication.this/*(Your Application Name)*/);
// registerActivityLifecycleCallbacks(MyApplication.this/(Your Application Name)///この行をアプリケーションクラスに追加するだけですべて正常に動作する
}