标准app基础模板建立-活动管理-定时服务-键值对存储-日志工具

一、建立工程

1.建立一个空白的工程,名称为ModelApp。

2.在main-java下新建package,起名com.jiaweiqiang.tools,用于放置通用工具类。

二、建立得到全局变量的Application类

1.在tools中新建MyApplication类,用于存储全局context和其他程序需要的通用变量。

public class MyApplication extends Application {
    private static Context context;
    private static LocalBroadcastManager localBroadcastManager;

    @Override
    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
        localBroadcastManager = LocalBroadcastManager.getInstance(context);
    }
    /**
     * 得到全局的一个Context
     * @return 全局的Context
     */
    public static Context getContext(){
        return context;
    }

    /**
     * 公用的本地广播的管理器,可以将广播限制在本软件接收
     * @return 公用的管理器
     */
    public static LocalBroadcastManager getLocalBroadcastManager(){
        return localBroadcastManager;
    }
}

2.在AndroManifest.xml文件中注册自定义的MyApplication类。

<application
        android:name="com.jiaweiqiang.tools.MyApplication"
       >

    </application>

三、统一管理活动

1.建立一个自定义的所有活动的父类,自动将所有活动添加到上面的ActivityCollector中统一管理。

/**
 * Created by jiaweiqiang on 2017/12/30.
 * <p>所有活动的父类,互动创建时增加了写入功能,活动销毁时,将活动移除</p>
 */

public class BaseActivity extends AppCompatActivity {
    public static List<Activity> activities = new ArrayList<Activity>();

    public static void addActivity(Activity activity){
        activities.add(activity);
    }

    public static void removeActivity(Activity activity){
        activities.remove(activity);
    }

    public static void finishAll(){
        for(Activity a : activities){
            if(!a.isFinishing()){
                a.finish();
            }
        }
    }
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addActivity(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        removeActivity(this);
    }
}

2.后续新建的活动全部要继承自BaseActivity。如果再某个活动要结束全部活动,直接调用静态方法即可。

四、定时服务工具

1.新建TimerService服务

/**
 * 定时服务,启动后,定时发送广播,完成定时功能
 * <p>提供精确定时和非精确定时</p>
 */
public class TimerService extends Service {
    /**
     * 定时进行广播,相当于全局定时器
     */
    public final static String TIMER_DISPLAY = "cou.jiaweiqiang.tools.timer";

    private static AlarmManager manager;
    private static Intent timeIntent;
    private static PendingIntent timePendingIntent;

    private static Handler sHandler ;
    private static Runnable sRunnable;

    public TimerService() {
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        timerBroadcast();
        return super.onStartCommand(intent, flags, startId);
    }
    /**
     * 定时进行广播,相当于全局定时器
     */
    private void timerBroadcast(){
        Intent intent = new Intent(TIMER_DISPLAY);
        MyApplication.getLocalBroadcastManager().sendBroadcast(intent);
    }

    /**
     * 开启定时服务,每次定时开启,可以在传入的活动或者服务的startCommond中重复调用执行代码
     * @param context 使用定时服务的上下文
     * @param interval 定时的间隔
     */
    public static void startAlarmByAlarmManager(Context context,int interval){
        manager = (AlarmManager)context.getSystemService(ALARM_SERVICE);
        int timer = interval;
        long triggerAtTimes = System.currentTimeMillis()+timer;
        timeIntent = new Intent(context,TimerService.class);
        timePendingIntent = PendingIntent.getService(context,0,timeIntent,0);
        manager.setRepeating(AlarmManager.RTC_WAKEUP,triggerAtTimes,timer,timePendingIntent);
    }
    public static void stopAlarmByAlarmManager(){
        manager.cancel(timePendingIntent);
    }

    /**
     * 定时工具,采用handler方法开启定时,一定时间间隔定时唤醒服务
     * @param context 需要开启的服务的上下文
     * @param interval 整数的时间间隔,以毫秒计算
     */
    public static void startAlarmByHandler(Context context, int interval){
        sHandler = new Handler() ;
        sRunnable = new Runnable() {
            @Override
            public void run() {
                TimerService.startService(context);
                sHandler.postDelayed(this,interval);
            }
        };

        sHandler.postDelayed(sRunnable,interval);
    }

    /**
     * 停止以handler方法开启的定时操作
     */
    public static void stopAlarmByHandler(){
        sHandler.removeCallbacks(sRunnable);
    }

    /**
     * 启动本服务的启动函数
     * @param context 启动服务的上下文
     */
    public static void startService(Context context){
        Intent intent = new Intent(context,TimerService.class);
        context.startService(intent);
    }
    /**
     * 停止本服务的函数
     * @param context 要停止服务的上下文
     */
    public static void stopService(Context context){
        Intent intent = new Intent(context,TimerService.class);
        context.stopService(intent);
    }

    /**
     * 为某个广播接收器注册接收定时广播的功能
     * @param mReceiver 要接收广播的接收器
     */
    public static void registerTimerReceiver(BroadcastReceiver mReceiver){
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(TimerService.TIMER_DISPLAY);
        MyApplication.getLocalBroadcastManager().registerReceiver(mReceiver,intentFilter);
    }

    /**
     * 为注册定时广播的接收器解除注册
     * @param mReceiver
     */
    public static void unregisterTimerReceiver(BroadcastReceiver mReceiver){
        MyApplication.getLocalBroadcastManager().unregisterReceiver(mReceiver);
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }
}

2.在需要定时服务的活动或者服务中,调用API进行注册并使用。

@Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        init();

        TimerService.registerTimerReceiver(mReceiver);
    }

 private BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            num++;
            mtxt.setText(String.valueOf(num));
        }
    };

Override
    protected void onDestroy() {
        super.onDestroy();
        TimerService.unregisterTimerReceiver(mReceiver);
    }

五、持久化存储

1.建立以程序名称为名称的键值对存储文件。并将存取函数用静态函数进行封装。

/**
 * Created by jiaweiqiang on 2017/12/31.
 * <p>程序公用的一个数据存储集合,是以程序名称命名的一个持久化存储文件的封装</p>
 * <p>其中主要存储一些程序运行的设置参数</p>
 */

public class DataShare {
    private static SharedPreferences pref;
    private static SharedPreferences.Editor editor;
    /**
     * 表示初次写入的标志位,如果是false,则表示从未写入,一旦写入,就变为true
     */
    private final static String FIRST_FLAG = "firstSetupFlag";
    public final static String ONCE_FLAG = "ifOnceMeasureFlag";
    public final static String SERIAL_MEASURE_TIMES = "serialMeasureTimes";

    //初始化程序数据,如果从未写入,则初次写入数据
    public DataShare(){
        //采用默认名称的存储
        pref = PreferenceManager.getDefaultSharedPreferences(MyApplication.getContext());
        editor = pref.edit();
        if(pref.getBoolean(FIRST_FLAG,false)== false){
            initPara();
        }else {
            editor.putBoolean(ONCE_FLAG,true);
            editor.apply();
        }
    }

    private void initPara(){
        editor.putBoolean(FIRST_FLAG,true);
        editor.putInt(SERIAL_MEASURE_TIMES,3);
        editor.putBoolean(ONCE_FLAG,true);

        editor.apply();
    }

    /**
     * 从程序的公用存储中得到制定名称的一个int值,如果此名称对应的值不存在,则返回-1
     * @param key int值对应的键名
     * @return 存储的int值
     */
    public static int getInt(String key){
        return pref.getInt(key,-1);
    }
    public static void putInt(String key,int data){
        editor.putInt(key,data);
        editor.apply();
    }
    /**
     * 从程序的公用存储中得到制定名称的一个float值,如果此名称对应的值不存在,则返回-1
     * @param key 值对应的键名
     * @return 存储的float值
     */
    public static float getFloat(String key){
        return pref.getFloat(key,-1);
    }
    public static void putFloat(String key,float data){
        editor.putFloat(key,data);
        editor.apply();
    }
    public static void putBoolean(String key,boolean data){
        editor.putBoolean(key,data);
        editor.apply();
    }
    public static  boolean getBoolean(String key){
        return pref.getBoolean(key,true);
    }
}

2.在MyApplication中初始化此类。

private static DataShare dataShare;

    @Override
    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
        localBroadcastManager = LocalBroadcastManager.getInstance(context);
        dataShare = new DataShare();
    }

六、定制日志工具

建立logUtil类

/**
 * Created by jiaweiqiang on 2018/1/21.
 * <p>可以通过将level设置不同的常量值,控制打印的范围</p>
 */

public class LogUtil {
    public static final int VERBOSE = 1;
    public static final int DEBUG = 2;
    public static final int INFO = 3;
    public static final int WARN = 4;
    public static final int ERROR = 5;
    public static final int NOTHING = 6;
    public static int level = VERBOSE;

    public static void v(String tag,String msg){
        if(level <= VERBOSE){
            Log.v(tag,msg);
        }
    }
    public static void d(String tag,String msg){
        if(level <= DEBUG){
            Log.d(tag,msg);
        }
    }
    public static void i(String tag,String msg){
        if(level <= INFO){
            Log.i(tag,msg);
        }
    }
    public static void w(String tag,String msg){
        if(level <= WARN){
            Log.w(tag,msg);
        }
    }
    public static void e(String tag,String msg){
        if(level <= ERROR){
            Log.e(tag,msg);
        }
    }

}

原文地址:https://www.cnblogs.com/JMatrix/p/8323721.html

时间: 2024-07-30 18:21:47

标准app基础模板建立-活动管理-定时服务-键值对存储-日志工具的相关文章

Android基础--键值对存储(SharedPreferences)

SharedPreferences用于将键值对形式的数据存储到当前应用专属的存储空间中 package com.itheima.sharedpreferences; import android.os.Bundle; import android.app.Activity; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.text.T

[转]SharePoint 2013 App 开发 (2) - 建立开发环境

这篇文章属于SharePoint 2013 App开发系列文章,到这篇文章为止,此系列的文章包括: SharePoint 2013 App开发 (1) - 什么是SharePoint App? SharePoint 2013 App开发 (2) - 建立开发环境 (本文) 在开发SharePoint App之前,开发人员需要有一个SharePoint开发环境.无论是开发何种类型的应用程序,开发人员都需要在开发机器上准备相应的开发环境.比如,如果是开发ASP.NET Web应用,那么在开发机器上除

Android 基础总结:(二)Android APP基础及组件

1.Android APP基础 Android应用程序是用Java编程语言写的.编译后的Java代码--包括应用程序要求的任何数据和资源文件,通过aapt工具捆绑成一个Android包,归档文件以.apk为后缀.这个文件是分发应用程序和安装到移动设备的中介或工具,用户下载这个文件到他们的设备上.一个.apk文件中的所有代码被认为是一个应用程序. aapt: aapt是Android Asset Packaging Tool的首字母缩写,这个工具包含在SDK的tools/目录下.查看.创建.更新与

【转】手摸手,带你用vue撸后台 系列四(vueAdmin 一个极简的后台基础模板)

前言 做这个 vueAdmin-template 的主要原因是: vue-element-admin 这个项目的初衷是一个vue的管理后台集成方案,把平时用到的一些组件或者经验分享给大家,同时它也在不断的维护和拓展中,比如最近重构了dashboard,加入了全屏功能,新增了tabs-view等等.所以项目会越来越复杂,不太适合很多初用vue的同学来构建后台.所以就写了这个基础模板,它没有复杂的功能,只包含了一个后台需要最基础的东西.vueAdmin-template 主要是基于vue-cli w

linux基础知识&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;逻辑卷管理器(lvm)

*****什么是lvm:           lvm就是将几个物理的分区通过软件组合成为一块看起来是独立的大磁盘(vg),然后将这块大磁盘分成可使用的分区. 然后就可以格式化创建文件系统,最终可以挂载使用啦.   *****我们该如何创建lvm呢? 一.首先创建分区,将其id设为8e,如下图   二.然后创建pv      pv阶段有如下常用的命令 pvcreate : 将物理的分区创建为pv pvscan  : 查看磁盘里的所有pv的信息 pvdiplay :查看pv的状态 pvremove

Hybrid APP基础篇(五)-&gt;JSBridge实现示例

说明 JSBridge实现示例 目录 前言 参考来源 楔子 JS实现部分 说明 实现 Android实现部分 说明 JSBridge类 实现 Callback类 实现 Webview容器关键代码 实现 API 类实现 iOS实现部分 说明 WebViewJavascriptBridgeBase 实现 WebViewJavascriptBridge 实现 Webview容器关键代码 实现 前言 参考来源 前人栽树,后台乘凉,本文参考了以下来源 Hybrid APP架构设计思路 marcuswest

《项目集管理标准》:全球项目集管理最佳实践

<项目集管理标准>是全球项目集管理最佳实践           <项目集管理标准>(The Standard for Program Management)是由美国项目管理协会推出的一个重要的国家性的,也是事实上的全球性标准.标准详细描述了项目集管理的内容,促进不同项目小组之间进行有效沟通和资源调配.提供了帮助人们理解如何通过提升相互关联的组件的交付能力从而促进组织战略实现的重要且基本的内容.在大多数情况对大部分项目集而言,被认为是清晰.完整的.相关的和公认的在项目集管理中良好实践

建立绩效管理体系

建立绩效管理体系就是确定企业的绩效管理方针.原则.标准和方法.其中明确各级人员的职责.设计企业绩效管理方案.规范绩效管理的操作步骤是重点.一般企业导入绩效管理体系的步骤如下: 第一,    首先确定绩效管理目标.管理方针,搞清楚企业绩效管理的出发点. 第二,    组建项目管理团队,确定专人负责,制订实施方案. 第三,    设计绩效管理体系.选择绩效管理工具.确定绩效管理标准,特别是设计绩效考核方案. 第四,    广泛征求意见,组织讨论方案,达到上下认同为止. 第五,    方案通过后组织宣

Spring 框架基础(05):事务管理机制,和实现方式

本文源码:GitHub·点这里 || GitEE·点这里 一.Spring事务管理 1.基础描述 Spring事务管理的本质就是封装了数据库对事务支持的操作,使用JDBC的事务管理机制,就是利用java.sql.Connection对象完成对事务的提交和回滚. Connection conn = DriverManager.getConnection(); try { // 自动提交设置为false conn.setAutoCommit(false); // 执行增删改查操作 // 当操作成功后