BaseActivity继承于 Activity可以减少代码的重复性,实现很多界面中共有的功能
下面就来写一下在一个APP中BaseActivity里面是写什么东西的
学过广播的都知道获取网络状态是通过截取广播实现的
1.写一个类继承BrocastReceiver 重写其中的onReceive()
2.实例化监听网络状态的两个类
//ConnectivityManager 监视网络状态发生改变,并发出广播通知
ConnectivityManager connectivityManager;
//描述当前网络状态
NetworkInfo info;
在onReceive中进行广播的接收操作
//如果可以得到当前网络发出的广播是有网络的
if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
//实例化ConnectivityManager
connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
//实例化
info=connectivityManager.getActiveNetworkInfo();
if(info!=null&&info.isAvailable()){
String name=info.getTypeName();
Toast.makeText(context,"当前 网络名称"+name,Toast.LENGTH_LONG).show();
}else{
Toast.makeText(context,"当前没有网络",Toast.LENGTH_LONG).show();
}
}
}
managaeBroadcastReceiver = new NetManagaeBroadcastReceiver();
//注册无序广播广播
IntentFilter mFliter = new IntentFilter();
mFliter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(managaeBroadcastReceiver, mFliter);
最后还要把广播取消注册,在OnDestory
if(managaeBroadcastReceiver!=null){
//取消广播的注册
unregisterReceiver(managaeBroadcastReceiver);
}
得到当前屏幕的分辨率和宽高将他们保存在全局变量中进行屏幕适配
创建一个全局变量(在Aplication中),用来存放当前屏幕的信息,并得到GetSet方法
private int screenWidth;//得到当前屏幕的宽度
private int screenHeight;//获得当前屏幕高度
public static Context appContext;//环境初始化
创建ResolutionUtils类用此类得到当前屏幕的宽高和分辨率,并将他们保存在全局变量
public class ResolutionUtils {
public void getScreenResolution(Context context){
//获取手机屏幕大小的类
DisplayMetrics dm=new DisplayMetrics();
//将当前 屏幕的信息赋值给DisplayMetrics类从而得到屏幕信息
((Activity)context).getWindowManager().getDefaultDisplay().getMetrics(dm);
//得到Application操作对象
PaoPaoApplication app=(PaoPaoApplication) ((Activity)context).getApplication();
//将屏幕的大小保存在全局变量当中
app.setScreenHeight(dm.heightPixels);
app.setScreenWidth(dm.widthPixels);
}
}
最后一步就是在当前Activity中去注册广播和得到当前屏幕的分辨率
在源码中我加了很多的注释所以直接上源码
当然在这里我还实现了按钮的点击事件
package com.xbl.paopaoclient.ui;
import android.app.Activity;
import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.net.ConnectivityManager;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import com.xbl.paopaoclient.receiver.NetManagaeBroadcastReceiver;
import com.xbl.paopaoclient.utils.ResolutionUtils;
/**
* Created by lenovo on 2017/1/7.
* BaseActivity可以提高代码的可复用性,减少重复的代码
* 网络环境的监控
* 获取屏幕的大小
*
*/
public abstract class BaseActivity extends Activity implements View.OnClickListener {
private static final int ACTIVITY_RESUME = 0;
private static final int ACTIVITY_STOP = 1;
private static final int ACTIVITY_PAUSE = 2;
private static final int ACTIVITY_DESTORY = 3;
public int activityState;
//监听网络环境变化的广播接收者
NetManagaeBroadcastReceiver managaeBroadcastReceiver;
//因为是抽象类所以实现点击事件的接口时可以不重写点击事件的方法
//是否允许全屏
private boolean mAllowFullScreen = true;
//是否注册过刷新广播
public static boolean isRegistAlarmReceiver = false;
public abstract void initWidget();
//实现此方法就相当于实现了按钮的点击事件
public abstract void widgetClick(View v);
public int isNotState=-1;
public void setmAllowFullScreen(boolean allowFullScreen){
this.mAllowFullScreen=allowFullScreen;
}
@Override
public void onClick(View v) {
widgetClick(v);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置窗口始终点亮
getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
managaeBroadcastReceiver = new NetManagaeBroadcastReceiver();
//注册无序广播广播
IntentFilter mFliter = new IntentFilter();
mFliter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(managaeBroadcastReceiver, mFliter);
//改变屏幕方向,竖屏锁定
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
//如果当前是竖屏状态,取消标题栏
if (mAllowFullScreen) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
}
initWidget();
//将当前屏幕的宽高保存在全局变量中
new ResolutionUtils().getScreenResolution(this);
}
@Override
protected void onStart() {
super.onStart();
}
//获取到用户焦点
@Override
protected void onResume() {
super.onResume();
activityState=ACTIVITY_RESUME;
}
//为什么super resume
@Override
protected void onStop() {
super.onStop();
activityState=ACTIVITY_STOP;
}
@Override
protected void onPause() {
super.onPause();
activityState = ACTIVITY_PAUSE;
}
@Override
protected void onRestart() {
super.onRestart();
}
@Override
protected void onDestroy() {
super.onDestroy();
if(managaeBroadcastReceiver!=null){
//取消广播的注册
unregisterReceiver(managaeBroadcastReceiver);
}
activityState=ACTIVITY_DESTORY;
}
}
需要注意的一点 既然我们是在BaseActivity的onCreat方法中注册和对屏幕进行赋值的所以我们自己的Activity在继承BaseActivity的时候别再重写onCreat()方法了,可是那这样我们想要在onCreat方法中实现的那些东西应该写到哪里
写到initWidget() 里面
例如:————这是我随便找的一段代码
@Override
public void initWidget() {
setContentView(R.layout.chat_layout);
ViewUtils.inject(this);
psw = Const.DEFAULT_PSW;
youName = Const.DEFAULT_YOUNAME;
initEMChat();
Intent intent = getIntent();
sendContent = intent.getStringExtra(Const.AGENCY_CONTENT);
// nofiCome = intent.getStringExtra("nofitycome");
if (intent.getIntExtra("nofityint", 0) == 10) {
// 传递过来的ArrayList接收
ArrayList temp = (ArrayList) intent
.getSerializableExtra("nofitycome");
System.out.println(temp.size() + "nidayede");
// 能过for存到本机的LinkList
for (int i = 0; i < temp.size(); i++) {
chatMessageList.add(temp.get(i));
}
}
// 设置后台的监听,设置Nofi
setchat();
init();
}
对于控件的实例化和点击事件我用的xUtils
这样是不是就减少了一些必要的重复的代码呢,这只是最基础的BaseActivity,每个不同的界面功能都还需要我们进行填充呢~