实训第八周(2)

接下来完成MyApplication

1. onCreate

因为引用的包过多,实现多包问题(加载MultiDex)

解决7.0(VERSION_CODES为N)以上系统照相机启动失败导致APP崩溃问题:虚拟机策略

SDK初始化,启动后台服务,若已存在用户登陆信息,SDK将完成自动登陆

    public void onCreate() {
        super.onCreate();
        mContext = getApplicationContext();

        MultiDex.install(this);
        instance = this;
        // 解决7.0 以上系统照相机启动失败导致 APP 崩溃问题
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
            StrictMode.setVmPolicy(builder.build());
        }
        sActivityStack = new Stack<>();

        // 初始化网易云通讯 SDK
        NIMClient.init(this,getLoginInfo(),getOptions());
    }


2. 获得SDK配置信息

SDK配置外置存储根目录内置SD卡

SDK配置用户资料提醒(用户资料)

SDK配置状态栏提醒的配置:不需响铃,点击通知栏跳转到MainActivity,需要振动

   private SDKOptions getOptions(){
        SDKOptions options = new SDKOptions();

        // 该目录目前包含 log, file, image, audio, video, thumb 这6个目录。
        // 如果第三方 APP 需要缓存清理功能, 清理这个目录下面个子目录的内容即可。
        if (!new File(Constant.APP_CACHE_PATH).exists()){
            FileUtils.mkDir(Constant.APP_CACHE_PATH);
        }
        options.sdkStorageRootPath = Constant.APP_CACHE_PATH;

        // 用户资料提供者, 目前主要用于提供用户资料,用于新消息通知栏中显示消息来源的头像和昵称
        options.userInfoProvider = new UserInfoProvider() {
            @Override
            public UserInfo getUserInfo(String account) {
                return null;
            }

            @Override
            public int getDefaultIconResId() {
                return R.mipmap.app_logo_main;
            }

            @Override
            public Bitmap getAvatarForMessageNotifier(String account) {
                return null;
            }

            @Override
            public String getDisplayNameForMessageNotifier(String account, String sessionId,
                                                           SessionTypeEnum sessionType) {
               return account;
            }

            @Override
            public Bitmap getTeamIcon(String tid) {
                return null;
            }
        };

        // 配置是否需要预下载附件缩略图,默认为 true
        options.preloadAttach = true;
        StatusBarNotificationConfig config = new StatusBarNotificationConfig();
        config.ring = false;
        config.notificationEntrance = MainActivity.class;
        config.vibrate = true;

        options.statusBarNotificationConfig = config;
        return options;
    }

其中,FileUtils(文件工具类)

package com.ezreal.ezchat.commonlibrary.utils;

import java.io.File;

/**
 * 文件工具类
 * Created by 张静
 */

public class FileUtils {

    /**
     * 递归创建文件夹,从最上层文件夹开始,只要不存在就会新建
     * @param dirPath 文件夹完整路径
     */
    public static void mkDir(String dirPath) {
        String[] dirArray = dirPath.split("/");
        String pathTemp = "";
        for (int i = 1; i < dirArray.length; i++) {
            pathTemp = pathTemp + "/" + dirArray[i];
            File newF = new File(dirArray[0] + pathTemp);
            if (!newF.exists()) {
                newF.mkdir();
            }
        }
    }
}


3. 登陆用户信息

如果已经存在登陆用户信息,通过NimUserHandler后台自动登陆

否则返回null

    private LoginInfo getLoginInfo(){
        String account = SharedPreferencesUtil.getStringSharedPreferences(this,
                Constant.LOCAL_LOGIN_TABLE, Constant.LOCAL_USER_ACCOUNT);
        String token = SharedPreferencesUtil.getStringSharedPreferences(this,
                Constant.LOCAL_LOGIN_TABLE, Constant.LOCAL_USER_TOKEN);
        if (!TextUtils.isEmpty(account) && !TextUtils.isEmpty(token)){
            LoginInfo info = new LoginInfo(account,token);
            NimUserHandler.getInstance().setMyAccount(account);
            return info;
        }
        return null;
    }


4.结束一个Activity

从堆栈中移除该activity,并finish该activity

    public void finishActivity(Activity activity){
        sActivityStack.remove(activity);
        activity.finish();
    }


5. 结束所有Activity

    public void finishAllActivity(){
        for (int i=0;i<sActivityStack.size();i++){
            if (sActivityStack.get(i) != null){
                sActivityStack.get(i).finish();
            }
        }
    }

6. 退出APP

结束进程,并释放资源

    public void AppExit(){
        try {
            finishAllActivity();
            Process.killProcess(Process.myPid());
            System.exit(0);
        }catch (Exception e){
            e.printStackTrace();
        }
    }


附上完整MyApplication.java

package com.ezreal.ezchat;

import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Build;
import android.os.Environment;
import android.os.Process;
import android.os.StrictMode;
import android.support.multidex.MultiDex;
import android.text.TextUtils;

import com.ezreal.ezchat.activity.MainActivity;
import com.ezreal.ezchat.handler.NimUserHandler;
import com.ezreal.ezchat.utils.Constant;
import com.netease.nimlib.sdk.NIMClient;
import com.netease.nimlib.sdk.SDKOptions;
import com.netease.nimlib.sdk.StatusBarNotificationConfig;
import com.netease.nimlib.sdk.auth.LoginInfo;
import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum;
import com.netease.nimlib.sdk.uinfo.UserInfoProvider;
import com.ezreal.ezchat.commonlibrary.utils.FileUtils;
import com.ezreal.ezchat.commonlibrary.utils.SharedPreferencesUtil;


import java.io.File;
import java.util.Stack;

/**
 * Created by 张静
 */

public class MyApplication extends Application {
    // 默认存放图片的路径
    public final static String DEFAULT_SAVE_IMAGE_PATH = Environment.getExternalStorageDirectory() + File.separator + "CircleDemo" + File.separator + "Images"
            + File.separator;

    private static Context mContext;
    private static MyApplication instance;
    private static Stack<Activity> sActivityStack;

    @Override
    public void onCreate() {
        super.onCreate();
        mContext = getApplicationContext();

        MultiDex.install(this);
        instance = this;
        // 解决7.0 以上系统照相机启动失败导致 APP 崩溃问题
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
            StrictMode.setVmPolicy(builder.build());
        }
        sActivityStack = new Stack<>();

        // 初始化网易云通讯 SDK
        NIMClient.init(this,getLoginInfo(),getOptions());
    }

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }

    private SDKOptions getOptions(){
        SDKOptions options = new SDKOptions();

        // 该目录目前包含 log, file, image, audio, video, thumb 这6个目录。
        // 如果第三方 APP 需要缓存清理功能, 清理这个目录下面个子目录的内容即可。
        if (!new File(Constant.APP_CACHE_PATH).exists()){
            FileUtils.mkDir(Constant.APP_CACHE_PATH);
        }
        options.sdkStorageRootPath = Constant.APP_CACHE_PATH;

        // 用户资料提供者, 目前主要用于提供用户资料,用于新消息通知栏中显示消息来源的头像和昵称
        options.userInfoProvider = new UserInfoProvider() {
            @Override
            public UserInfo getUserInfo(String account) {
                return null;
            }

            @Override
            public int getDefaultIconResId() {
                return R.mipmap.app_logo_main;
            }

            @Override
            public Bitmap getAvatarForMessageNotifier(String account) {
                return null;
            }

            @Override
            public String getDisplayNameForMessageNotifier(String account, String sessionId,
                                                           SessionTypeEnum sessionType) {
               return account;
            }

            @Override
            public Bitmap getTeamIcon(String tid) {
                return null;
            }
        };

        // 配置是否需要预下载附件缩略图,默认为 true
        options.preloadAttach = true;
        StatusBarNotificationConfig config = new StatusBarNotificationConfig();
        config.ring = false;
        config.notificationEntrance = MainActivity.class;
        config.vibrate = true;

        options.statusBarNotificationConfig = config;
        return options;
    }

    private LoginInfo getLoginInfo(){
        String account = SharedPreferencesUtil.getStringSharedPreferences(this,
                Constant.LOCAL_LOGIN_TABLE, Constant.LOCAL_USER_ACCOUNT);
        String token = SharedPreferencesUtil.getStringSharedPreferences(this,
                Constant.LOCAL_LOGIN_TABLE, Constant.LOCAL_USER_TOKEN);
        if (!TextUtils.isEmpty(account) && !TextUtils.isEmpty(token)){
            LoginInfo info = new LoginInfo(account,token);
            NimUserHandler.getInstance().setMyAccount(account);
            return info;
        }
        return null;
    }

    public static MyApplication getInstance(){
        return instance;
    }

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

    public void finishActivity(Activity activity){
        sActivityStack.remove(activity);
        activity.finish();
    }

    public void finishAllActivity(){
        for (int i=0;i<sActivityStack.size();i++){
            if (sActivityStack.get(i) != null){
                sActivityStack.get(i).finish();
            }
        }
    }

    public void AppExit(){
        try {
            finishAllActivity();
            Process.killProcess(Process.myPid());
            System.exit(0);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    public static Context getContext(){
        return mContext;
    }

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值