讲一个项目常见的功能,友盟统计功能

例如一个项目有很多多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官方架构组件介绍之应用(四)的更多相关文章

  1. Android官方架构组件介绍之LifeCycle(一)

    Android官方架构组件介绍之LifeCycle 下面是官方提供的Android App开发的架构图: 从上图可以看到一些关键字:ViewModel,LiveData,Room等.其实看了上面视频的 ...

  2. Android官方架构组件介绍之LifeCycle

    Google 2017 I/O开发者大会于近日召开,在开发者大会上谷歌除了发布了Android O等一些新产品之外,也对Android代码的架构做出了一个官方的回应. Google 2017 I/O开 ...

  3. Android官方架构组件介绍之ViewModel

    ViewModel 像Activity,Fragment这类应用组件都有自己的生命周期并且是被Android的Framework所管理的.Framework可能会根据用户的一些操作和设备的状态对Act ...

  4. Android官方架构组件介绍之LiveData

    LiveData LiveData是一个用于持有数据并支持数据可被监听(观察).和传统的观察者模式中的被观察者不一样,LiveData是一个生命周期感知组件,因此观察者可以指定某一个LifeCycle ...

  5. Android官方架构组件介绍之ViewModel(三)

    ViewModel 像Activity,Fragment这类应用组件都有自己的生命周期并且是被Android的Framework所管理的.Framework可能会根据用户的一些操作和设备的状态对Act ...

  6. Android官方架构组件介绍之LiveData(二)

    LiveData LiveData是一个用于持有数据并支持数据可被监听(观察).和传统的观察者模式中的被观察者不一样,LiveData是一个生命周期感知组件,因此观察者可以指定某一个LifeCycle ...

  7. 改造 Android 官方架构组件 ViewModel

    前言 Android 官方架构组件在今年 5 月份 Google I/O 大会上被公布, 直到 11 月份一直都是测试版, 由于工作比较繁忙, 期间我只是看过类似的文章, 但没有在实际项目中使用过, ...

  8. Android官方架构组件指南

    此指南适用于那些曾经或现在进行Android应用的基础开发,并希望了解和学习编写Android程序的最佳实践和架构.通过学习来构建强大的生产级别的应用. 注意:此指南默认你对Android开发有比较深 ...

  9. Android系统架构说明介绍

    Android系统架构说明介绍 Android系统架构和一些普遍的操作系统差不多,都是采用了分层的架构,从他们之间的架构图看,Android系统架构分为四个层,从高层到低层分别是应用程序层.应用程序框 ...

随机推荐

  1. swing重绘按钮为任意形状图案的方法

    swing重绘按钮为任意形状图案的方法 摘自https://www.jb51.net/article/131290.htm 转载  更新时间:2017年12月22日 13:43:00   作者:_Th ...

  2. linux deb及rpm格式软件安装

    deb格式软件安装 deb包是debian,ubuntu等LINUX发行版的软件安装包,是类似于rpm的软件包,而非debian,ubuntu系统不推荐使用deb软件包,因为要解决软件包依赖问题,安装 ...

  3. SDUT 3343 数据结构实验之二叉树四:还原二叉树

    数据结构实验之二叉树四:还原二叉树 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 给定一棵 ...

  4. 树莓派(Raspberry Pi 3) 使用wifi模块连接网络

    树莓派3B内置了wifi和蓝牙模块,启动WIFI模块有两种方式,一种是图形界面,一种是命令行模式. 使用图形界面: 在桌面右上角的菜单栏里面选择wifi,输入密码就可以了. 使用命令行: 第一步:配置 ...

  5. c#设计模式-单例模式【转】

    单例模式三种写法: 第一种最简单,但没有考虑线程安全,在多线程时可能会出问题 public class Singleton { private static Singleton _instance = ...

  6. ASP.NET网页动态添加数据行

    一看到这标题<ASP.NET网页动态添加数据行>,想起来似乎有点难实现.因为网页的周期性原因,往往在PostBack之后,状态难于有所保留.但Insus.NET又想实现这样的效果,用户点击 ...

  7. linux linux系统常用设置

    linux  linux系统常用设置 一.设置开机时开启数字键 修改rc.local文件 命令:vi  /etc/rc.local rc.local文件中增加如下代码: INITTY=/dev/tty ...

  8. swift 纯代码自定义控件

    1.创建自定义控件 import UIKit class CustomView: UIView { var lab:UILabel! var btn:UIButton! /************ 将 ...

  9. Mybatis基于代理Dao实现CRUD操作 及 Mybatis的参数深入

    Mybatis基于代理Dao实现CRUD操作 使用要求: 1.持久层接口和持久层接口的映射配置必须在相同的包下 2.持久层映射配置中mapper标签的namespace属性取值必须是持久层接口的全限定 ...

  10. ThinkPHP CURD 操作

    Thinkphp CURD操作php中实例还对象即可操作 (目录) 1.Add 1 调式程序 3 调出显示页面Trace信息 3 Dump 的含义 4 2.数据库查询 4 1.直接使用字符串进行查找 ...