AWT*_*AWT 30 java lifecycle android callback
我正在尝试使用ActivityLifecycleCallbacks自动捕获和记录Android生命周期事件,但至少可以说这个问题的文档很少:
public void registerActivityLifecycleCallbacks (Application.ActivityLifecycleCallbacks callback)
Run Code Online (Sandbox Code Playgroud)
我不想扩展Activity类或覆盖现有的生命周期方法(onCreate,onResume等等).我希望有一个单独的类来监听这些事件并采取相应的行动.
有没有人有这方面的经验,或者链接到良好的文档或教程如何工作?具体来说,如何注册ActivityLifecycleCallbacks,以及如何处理它们?
Jer*_*oen 48
我没有任何第一手经验但是从API判断你可以编写自己的类来实现Application.ActivityLifecycleCallbacks
接口并在提供的Application
类实例上注册该类
getApplicaton().registerActivityLifecycleCallbacks(yourCustomClass);
Run Code Online (Sandbox Code Playgroud)
此课程将收到与您的个人活动相同的回调.祝好运.
PS.这是API级别14 btw,因此它不适用于旧款手机.
Cla*_*kXP 33
我做了自己的实现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);
}
Run Code Online (Sandbox Code Playgroud)
其次,我在Application的类中实现了这个接口:
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());
}
}
Run Code Online (Sandbox Code Playgroud)
第三,我正在创建一个从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);
}
}
Run Code Online (Sandbox Code Playgroud)
第四,从SherlockActivity扩展的所有类,我替换为MySherlockActivity:
public class MainActivity extends MySherlockActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,在logcat中,您将看到在MyApplication中进行的Interface实现中编写的日志.
UPDATE
这个实现是从API Level 9(Gingerbread),API Level 12(Honeycomb)和API Level 17(Jelly Bean)测试的,并且工作正常.可能适用于Android的旧版本.
试试这个:http://engineering.meetme.com/2015/04/android-define-when-app-is-opened-or-filled/#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();
}
Run Code Online (Sandbox Code Playgroud)
你的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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
它还包括用于确定应用程序打开方式的提示和技巧 - 从通知、打开应用程序的 URL 或直接从应用程序菜单。这是通过Enum
Application 类中的一个来完成的:
public enum LaunchMechanism {
DIRECT,
NOTIFICATION,
URL,
BACKGROUND
}
private LaunchMechanism mLaunchMechanism = LaunchMechanism.DIRECT;
public void setLaunchMechanism(LaunchMechanism launchMechanism) {
mLaunchMechanism = launchMechanism;
}
Run Code Online (Sandbox Code Playgroud)
在我们的实现中,我们有一些标志来指示何时启动将启动第三方活动的活动,例如用户是否从我们的应用程序拨打电话或是否启动浏览器。然后,在启动活动中,onStop()
我们执行如下检查,仅在这些标志为 false 时报告活动的不可见性:
if(!flag_userLaunchedThirdPartyActivity){
AppForegroundStateManager.getInstance().onActivityNotVisible(this);
}
Run Code Online (Sandbox Code Playgroud)
为了检查应用程序是否进入后台 - 例如当设备的屏幕变暗或用户接到电话时 - 它的工作方式如下:
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;
}
Run Code Online (Sandbox Code Playgroud)
此解决方案不依赖于 API 级别,因此它应该一直工作到 API 级别 1。
小智 5
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(MyApplication.this/*(Your Application Name)*/);
}
Run Code Online (Sandbox Code Playgroud)
只在 Application 类上添加这一行,一切正常。
归档时间: |
|
查看次数: |
34577 次 |
最近记录: |