Android官方架构组件介绍之应用(四)
讲一个项目常见的功能,友盟统计功能
例如一个项目有很多多modlue,每个里面modlue都有Activity,Activity需要友盟统一,Fragment也需要友盟统计。一般做法就是继承一个BaseActivity,BaseFragment。
然后在BaseActivity,BaseFragment大概是这样的
import android.support.v7.app.AppCompatActivity;
public class BaseActivity extends AppCompatActivity {
@Override
protected void onStart() {
super.onStart();
MobclickAgent.onPageStart(getPageName(this));
}
@Override
protected void onStop() {
super.onStop();
MobclickAgent.onPageEnd(getPageName(this));
}
}

但是如果你们代码,引入了其他的AAR代码,他们aar里面有Activity,但是你也该不了别人代码,但是你们需要统计他们Activity,这个时候怎么办?
public class ActivityLifecycleMonitorCallback implements Application.ActivityLifecycleCallbacks {
private static final boolean DEBUG = AppEnv.bAppdebug;
private static final String TAG = DEBUG ? "ActivityLifecyMonitor" : ActivityLifecyMonitor.class.getSimpleName();
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
if (DEBUG) {
Log.i(TAG, getPageName(activity) + " onActivityCreated activity="+activity.hashCode());
}
}
@Override
public void onActivityStarted(Activity activity) {
if (DEBUG) {
Log.i(TAG, getPageName(activity) + " onActivityStarted");
}
MobclickAgent.onPageStart(getPageName(activity));
}
@Override
public void onActivityResumed(Activity activity) {
if (DEBUG) {
Log.i(TAG, getPageName(activity) + " onActivityResumed");
}
MobclickAgent.onResume(activity);
}
@Override
public void onActivityPaused(Activity activity) {
if (DEBUG) {
Log.i(TAG, getPageName(activity) + " onActivityPaused");
}
MobclickAgent.onPause(activity);
}
@Override
public void onActivityStopped(Activity activity) {
if (DEBUG) {
Log.i(TAG, getPageName(activity) + " onActivityStopped");
}
MobclickAgent.onPageEnd(getPageName(activity));
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
if (DEBUG) {
Log.i(TAG, getPageName(activity) + " onActivitySaveInstanceState");
}
}
@Override
public void onActivityDestroyed(Activity activity) {
if (DEBUG) {
Log.i(TAG, getPageName(activity) + " onActivityDestroyed activity="+activity.hashCode());
}
}
private String getPageName(Activity activity) {
return activity.getClass().getName();
}
}
然后在Application里面注册
private void registerActivityLifecycleCallback(Application application) {
ActivityLifecycleMonitorCallback activityLifecycleMonitor = new ActivityLifecycleMonitorCallback();
application.registerActivityLifecycleCallbacks(activityLifecycleMonitor);
}
Android官方架构组件介绍之应用(四)的更多相关文章
- Android官方架构组件介绍之LifeCycle(一)
Android官方架构组件介绍之LifeCycle 下面是官方提供的Android App开发的架构图: 从上图可以看到一些关键字:ViewModel,LiveData,Room等.其实看了上面视频的 ...
- Android官方架构组件介绍之LifeCycle
Google 2017 I/O开发者大会于近日召开,在开发者大会上谷歌除了发布了Android O等一些新产品之外,也对Android代码的架构做出了一个官方的回应. Google 2017 I/O开 ...
- Android官方架构组件介绍之ViewModel
ViewModel 像Activity,Fragment这类应用组件都有自己的生命周期并且是被Android的Framework所管理的.Framework可能会根据用户的一些操作和设备的状态对Act ...
- Android官方架构组件介绍之LiveData
LiveData LiveData是一个用于持有数据并支持数据可被监听(观察).和传统的观察者模式中的被观察者不一样,LiveData是一个生命周期感知组件,因此观察者可以指定某一个LifeCycle ...
- Android官方架构组件介绍之ViewModel(三)
ViewModel 像Activity,Fragment这类应用组件都有自己的生命周期并且是被Android的Framework所管理的.Framework可能会根据用户的一些操作和设备的状态对Act ...
- Android官方架构组件介绍之LiveData(二)
LiveData LiveData是一个用于持有数据并支持数据可被监听(观察).和传统的观察者模式中的被观察者不一样,LiveData是一个生命周期感知组件,因此观察者可以指定某一个LifeCycle ...
- 改造 Android 官方架构组件 ViewModel
前言 Android 官方架构组件在今年 5 月份 Google I/O 大会上被公布, 直到 11 月份一直都是测试版, 由于工作比较繁忙, 期间我只是看过类似的文章, 但没有在实际项目中使用过, ...
- Android官方架构组件指南
此指南适用于那些曾经或现在进行Android应用的基础开发,并希望了解和学习编写Android程序的最佳实践和架构.通过学习来构建强大的生产级别的应用. 注意:此指南默认你对Android开发有比较深 ...
- Android系统架构说明介绍
Android系统架构说明介绍 Android系统架构和一些普遍的操作系统差不多,都是采用了分层的架构,从他们之间的架构图看,Android系统架构分为四个层,从高层到低层分别是应用程序层.应用程序框 ...
随机推荐
- mysql--笔记1
今日内容介绍1.MySQL数据库2.SQL语句=========================================================1 数据库概念 1.1: 什么是数据库 ...
- Android 实现形态各异的双向侧滑菜单 自定义控件来袭(转载)
1.概述 关于自定义控件侧滑已经写了两篇了~~今天决定把之前的单向改成双向,当然了,单纯的改动之前的代码也没意思,今天不仅会把之前的单向改为双向,还会多添加一种侧滑效果,给大家带来若干种形态各异的双向 ...
- android加载字体内存泄漏的处理方法
在开发android app的开发过程中,会使用到外部的一些字体.外部字体在加载的时候,容易造成内存泄漏. 比如: Typeface tf=Typeface.createFromAsset(getAs ...
- [译]Javascript中的mutators
本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...
- 多用户ATM机(面向对象编程)
let readline = require('readline-sync'); // 清屏函数 let clear = () => process.stdout.write(process.p ...
- 移动端自适应个人理解与收集——rem
rem——更好的适配移动端.这个单位我一直想弄个究竟,今天终于看了个差不多.看了很多的博客.心中总算有自己的想法.(还有vh,vw这里我这个小白还没有弄明白就先不写了.) 1.rem可以在html,b ...
- JavaEE常用开发工具分享
链接:https://pan.baidu.com/s/1Jxd2Y45LhWAUHc8-dM_ukw 提取码:h50f
- 并查集【洛谷P1197】 [JSOI2008]星球大战
P1197 [JSOI2008]星球大战 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系 ...
- 牛客nowcoder NOIP普及组第三场
qtmd AK了 直接题解吧 题目链接 A-十七边形 牛牛想在一个半径为r的圆中,找到一个内接的十七边形,使他的面积最大.输入半径r,输出最大的面积. 1 <= r <= 10000 在1 ...
- freemarker常用标签解释二
1 assign 指令 使用这个指令你可以创建一个新的变量,或者替换一个已经存在的变量.注意仅仅顶级变量可以被创建/替换(也就是说你不能创建/替换some_hash.subvar,除了some_has ...