资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

android基类,android开发基础知识

android 怎么在基类里操作控件

我们另外写一个Activity的基类BaseActivity,这个类也是继承自FinalActivity,而且在这个基类里面我们可以实现一些公共的方法,这样其他的Activity继承自我们这个BaseActivity基类,既可以使用FinalActivity里面封装好的方法,也可以使用我们在BaseActivity里面扩展的一些公共的方法。如果我们再抽象一层的话,我们可以把这些公共的方法抽象到一个接口里面,然后我们的BaseActivity实现这个接口,这样也可以实现程序的扩展。

十载的博山网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。全网营销推广的优势是能够根据用户设备显示端的尺寸不同,自动调整博山建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联公司从事“博山网站设计”,“博山网站推广”以来,每个客户项目都认真落实执行。

下面贴一些我整理的一些代码

首先是抽象出来的一个Activity的接口

/**

* Activity的支持类接口,主要定义了Activity中常用的功能

*

* @Package com.example.myallutils

*

* TODO

* @author ZhaoKaiQiang

*

* @time 2014年5月7日

*/

public interface IBaseActivity {

/**

* 获取Application对象

*

* @return

*/

public abstract Application getApplication();

/**

* 开启服务

*/

public abstract void startService();

/**

* 停止服务

*/

public abstract void stopService();

/**

* 判断是否有网络连接,若没有,则弹出网络设置对话框,返回false

*

* @return

*/

public abstract boolean validateInternet();

/**

*

* 判断是否有网络连接,没有返回false

*

*/

public abstract boolean hasInternetConnected();

/**

* 退出应用

*/

public abstract void isExit();

/**

* 判断GPS是否已经开启.

*

* @return

*/

public abstract boolean hasLocationGPS();

/**

* 判断基站是否已经开启.

*/

public abstract boolean hasLocationNetWork();

/**

* 检查内存卡.

*/

public abstract void checkMemoryCard();

/**

* 获取进度条.

*

* @return

*/

public abstract ProgressDialog getProgressDialog();

/**

* 返回当前Activity上下文.

*/

public abstract Context getContext();

/**

* 获取当前登录用户的SharedPreferences配置.

*/

public SharedPreferences getLoginUserSharedPre();

/**

* 用户是否在线(当前网络是否重连成功)

*/

public boolean getUserOnlineState();

/**

* 设置用户在线状态 true 在线 false 不在线

*

* @param isOnline

*/

public void setUserOnlineState(boolean isOnline);

/**

*

* 发出Notification的method.

*

* @param iconId

* 图标

* @param contentTitle

* 标题

* @param contentText

* 内容

* @param activity

*/

public void PushNotification(int iconId, String contentTitle,

String contentText, Class? activity, String from);

}

下面是对这个接口的实现,是所有Activity的基类

/**

* Activity的基类,实现了IActivitySupport接口

*

* @Package com.example.myallutils

*

* TODO

* @author ZhaoKaiQiang

*

* @time 2014年5月7日

*/

public abstract class BaseActivity extends FinalActivity implements

IBaseActivity {

protected Context mContext = null;

protected SharedPreferences preferences;

protected MyApplication myApplication;

protected ProgressDialog pg = null;

protected NotificationManager notificationManager;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

mContext = this;

preferences = getSharedPreferences("TAG", 0);

notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

pg = new ProgressDialog(mContext);

myApplication = (MyApplication) getApplication();

}

/**

* 初始化页面布局

*/

abstract void iniView();

@Override

protected void onStart() {

super.onStart();

}

@Override

protected void onResume() {

super.onResume();

}

@Override

protected void onPause() {

super.onPause();

}

@Override

protected void onStop() {

super.onStop();

}

@Override

public void onDestroy() {

super.onDestroy();

}

@Override

public ProgressDialog getProgressDialog() {

return pg;

}

/**

* 在这里开启所有需要开启的服务

*/

@Override

public void startService() {

}

/**

* 在这里关闭所有需要开启的服务

*/

@Override

public void stopService() {

}

/**

* 停止服务并结束所有的Activity退出应用

*/

@Override

public void isExit() {

new AlertDialog.Builder(mContext).setTitle("确定退出吗?")

.setNeutralButton("确定", new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

stopService();

myApplication.exit();

}

})

.setNegativeButton("取消", new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

dialog.cancel();

}

}).show();

}

/**

* 判断是否有网络连接,没有返回false

*/

@Override

public boolean hasInternetConnected() {

ConnectivityManager manager = (ConnectivityManager) mContext

.getSystemService(Context.CONNECTIVITY_SERVICE);

if (manager != null) {

NetworkInfo network = manager.getActiveNetworkInfo();

if (network != null network.isConnectedOrConnecting()) {

return true;

}

}

return false;

}

/**

* 判断是否有网络连接,若没有,则弹出网络设置对话框,返回false

*/

@Override

public boolean validateInternet() {

ConnectivityManager manager = (ConnectivityManager) mContext

.getSystemService(Context.CONNECTIVITY_SERVICE);

if (manager == null) {

openWirelessSet();

return false;

} else {

NetworkInfo[] info = manager.getAllNetworkInfo();

if (info != null) {

for (int i = 0; i info.length; i++) {

if (info[i].getState() == NetworkInfo.State.CONNECTED) {

return true;

}

}

}

}

openWirelessSet();

return false;

}

/**

* 判断GPS定位服务是否开启

*/

@Override

public boolean hasLocationGPS() {

LocationManager manager = (LocationManager) mContext

.getSystemService(Context.LOCATION_SERVICE);

if (manager

.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)) {

return true;

} else {

return false;

}

}

/**

* 判断基站定位是否开启

*/

@Override

public boolean hasLocationNetWork() {

LocationManager manager = (LocationManager) mContext

.getSystemService(Context.LOCATION_SERVICE);

if (manager

.isProviderEnabled(android.location.LocationManager.NETWORK_PROVIDER)) {

return true;

} else {

return false;

}

}

/**

* 检查内存卡可读

*/

@Override

public void checkMemoryCard() {

if (!Environment.MEDIA_MOUNTED.equals(Environment

.getExternalStorageState())) {

new AlertDialog.Builder(mContext)

.setTitle("检测内存卡")

.setMessage("请检查内存卡")

.setPositiveButton("设置",

new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog,

int which) {

dialog.cancel();

Intent intent = new Intent(

Settings.ACTION_SETTINGS);

mContext.startActivity(intent);

}

})

.setNegativeButton("退出",

new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog,

int which) {

dialog.cancel();

}

}).create().show();

}

}

/**

* 打开网络设置对话框

*/

public void openWirelessSet() {

AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(mContext);

dialogBuilder

.setTitle("网络设置")

.setMessage("检查网络")

.setPositiveButton("网络设置",

new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog,

int which) {

dialog.cancel();

Intent intent = new Intent(

Settings.ACTION_WIRELESS_SETTINGS);

mContext.startActivity(intent);

}

})

.setNegativeButton("取消", new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int whichButton) {

dialog.cancel();

}

});

dialogBuilder.show();

}

/**

* 关闭键盘

*/

public void closeInput() {

InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);

if (inputMethodManager != null this.getCurrentFocus() != null) {

inputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus()

.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

}

}

/**

*

* 发出Notification

*

* @param iconId

* 图标

* @param contentTitle

* 标题

* @param contentText

* 你内容

* @param activity

*/

@SuppressWarnings("deprecation")

public void PushNotification(int iconId, String contentTitle,

String contentText, Class? activity, String to) {

// 创建新的Intent,作为点击Notification留言条时, 会运行的Activity

Intent notifyIntent = new Intent(this, activity);

notifyIntent.putExtra("to", to);

// 创建PendingIntent作为设置递延运行的Activity

PendingIntent appIntent = PendingIntent.getActivity(mContext, 0,

notifyIntent, 0);

/* 创建Notication,并设置相关参数 */

Notification myNoti = new Notification();

// 点击自动消失

myNoti.flags = Notification.FLAG_AUTO_CANCEL;

/* 设置statusbar显示的icon */

myNoti.icon = iconId;

/* 设置statusbar显示的文字信息 */

myNoti.tickerText = contentTitle;

/* 设置notification发生时同时发出默认声音 */

myNoti.defaults = Notification.DEFAULT_SOUND;

/* 设置Notification留言条的参数 */

myNoti.setLatestEventInfo(mContext, contentTitle, contentText,

appIntent);

/* 送出Notification */

notificationManager.notify(0, myNoti);

}

/**

* 返回上下文对象

*/

@Override

public Context getContext() {

return mContext;

}

/**

* 返回登录用户的SharedPreferences对象

*/

@Override

public SharedPreferences getLoginUserSharedPre() {

return preferences;

}

/**

* 获取用户在线状态

*/

@Override

public boolean getUserOnlineState() {

return false;

}

/**

* 设置用户在线状态

*/

@Override

public void setUserOnlineState(boolean isOnline) {

}

}

android开发基类和工具类要在androidmanifest.xml里注册吗

是的,不管是eclipse还是studio,都是在AndroidManifest.xml中增加权限。 Android Studio 是一个Android开发环境,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studio 提供了集成的 Android 开发工具用于开发和调试。 在IDEA的基础上,Android Studio 提供 :1. 基于Gradle的构建支持。2. Android 专属的重构和快速修复。3. 提示工具以捕获性能、可用性、版本兼容性等问题。4. 支持ProGuard 和应用签名。5. 基于模板的向导来生成常用的 Android 应用设计和组件。6. 功能强大的布局编辑器,可以拖拉 UI 控件并进行效果预览。

Android为什么要创建Activity基类以及Activity基类中一般有哪些方法

 首先,在现在的项目中使用的主要是afinal框架,而且这个框架确实比较不错,省去了不少工作量,在编写Activity的过程中,基本都是直接继承自FinalActivity类,这样可以使用这个类给我们封装好的不少的方法,但是随着项目慢慢推进,这种直接继承框架类的一些缺点也开始慢慢的显现出来。最主要的就是扩展性受到了一些限制,比如对于Activity,我们一般进行控件的初始化操作,为了使代码风格更加的简介明了,我一般都是在一个单独的initView()方法中实现对控件的初始化,然后在onCreate中直接调用这个方法实现控件的初始化。除此之外,在很多的涉及到网络连接的Activity中需要对网络情况进行检测,如果网络状况出现问题,就弹出一个对话框提醒用户进行网络的设置或者是检查。像是这种的需求,我们最好能抽成单独的方法,这样我们就不需要在每个Activity中都写大量的代码进行设置。但是由于我们是直接集成自FinalActivity,所以一个实现方案就是直接修改我们的FinalActivity的源代码,增加这些公共的方法,但是这样就修改了外部框架的源代码,增加了代码之间的耦合度,当我们在另外的项目中需要使用这个框架的时候,就需要再改源代码,所以说这样的方式可以解决问题,但并不是最好的解决方案。

另外一种解决方案就是我们另外写一个Activity的基类BaseActivity,这个类也是继承自FinalActivity,而且在这个基类里面我们可以实现一些公共的方法,这样其他的Activity继承自我们这个BaseActivity基类,既可以使用FinalActivity里面封装好的方法,也可以使用我们在BaseActivity里面扩展的一些公共的方法。如果我们再抽象一层的话,我们可以把这些公共的方法抽象到一个接口里面,然后我们的BaseActivity实现这个接口,这样也可以实现程序的扩展。

下面贴一些我整理的一些代码

首先是抽象出来的一个Activity的接口

在我们定义的Activity中就可以这样使用

view sourceprint?

01./**

02.*

03.* @Package com.example.myallutils

04.*

05.*          TODO

06.* @author ZhaoKaiQiang

07.*

08.* @time 2014年5月6日

09.*/

10.public class MainActivity extends BaseActivity {

11.

12.@Override

13.protected void onCreate(Bundle savedInstanceState) {

14.super.onCreate(savedInstanceState);

15.setContentView(R.layout.activity_main);

16.iniView();

17.}

18.

19.@Override

20.void iniView() {

21.mContext = this;

22.validateInternet();

23.PushNotification(R.drawable.ic_launcher, "测试", "内容测试", OtherActivity.class,

24."嘻嘻");

25.}

26.

27.}

经过几层抽象,我们可以看到,代码的扩展性和耦合性确实得到了一定的改善,这篇文章只针对菜鸟,如果有牛人有幸可以看到这篇文章,还希望可以指教一二!

Android 基类BaseActivity的封装

摘要

本篇总结了前人写的BaseActivity,自己在开发过程中也添添补补,删删改改,现在总结下。

本篇很多知识借鉴和学习了知乎上iYng大大的回答,先感谢一波。顺便上原文链接:

正文

一般来说,不同的项目的BaseActivity不尽相同,根据不同的业务逻辑和功能需求,会有很多区别。这里总结了一些,如下:

视图相关

一般的Activity里都会用到很多的findViewById这个方法,而且每次都要强制类型转换,这样会显得很繁琐,如果在BaseActivity里封装好,就能省事:

这样只要是继承了BaseActivity就能轻松使用LinearLayout llContent = findView(R.id.ll_content);,免去了诸多类型转换的麻烦。

然后说起视图,一般的Activity里都会需要初始化视图和数据,所以可以暴露两个方法initView()和initData():

然后在setContentView里去调用,一般都是先initView,然后再initData:

这样子类里都必须重写initView()和initData()了,逻辑也能清晰点,不然什么东西都放在onCreate里,就很乱了;

用户模块(业务相关【可选】)

不过一般的app,只要是有登录的,就会有用户模块,也会根据用户标识id去进行一些网络操作,所以用户模块可以在BaseActivity中暴露一些方法,比如用户id的获取:

这里就是返回了SharedPreference里存储的用户id,在用户id大量被使用的场景下,这样的封装还是很有必要的,使用起来也更便捷。当然如果只是纯展示的app就不一定需要了,或许显得多余。

界面间跳转传参

很多时候,Activity之间都会传参,所以可以封装一个参数处理的函数initParam(),在BaseActivity的onCreate里去判断是否有参数传过来;

然后把initParam()方法暴露给子类:

这个方法并不是必须重写的,因为传参也没有想象中那么多,并不需要强制重写这个方法。

一般会在Application类里去定义一个isDebug来判断是否开启调试(开发者模式):

在BaseActivity里,我们可以把isDebug作为总开关,然后控制是否显示调试信息:

这样一键关闭调试,不用去一个个删项目里的Log信息,是不是很赞?

每次Toast,都用Toast.makeText(...).show();是不是很烦?那么可以在BaseActivity里封装下,比如:

这里ToastUtils就是一个Toast封装类,里面的内容估计大家都懂。然后这样一来,所有子类在使用时,只需要潇洒写一句toast("xxxx")就行了,当然也可以一并封装Toast.LENGTH_LONG和Toast.LENGTH_SHORT,按需封装吧。

其他

软键盘

有的app里,用户输入的情景会比较多,这个时候,软键盘的隐藏就用的多了,用户输入完之后,或者用户点击屏幕空白处,都应该去隐藏软键盘,这样的话,可以考虑在BaseActivity里写隐藏的方法:

上面3个方法也是很实用的。dispatchTouchEvent方法不需要手动调用,只要是有点击事件,并且点击在软键盘和EditText区域外,就会隐藏软键盘。

防止快速点击

有时候,用户(特别是测试猿)会疯狂的点击app,这一举动的原因和意义不明,但是我们可以设置防止快速点击给app造成的伤害和负担:

这样在1秒之内只会响应一次,麻麻再也不用担心我手抽筋乱点了。

那么怎么用呢?举个栗子,可以在onClick接口里去判断下嘛:

页面跳转:startActivity、startActivityForResult

这个也是可选的,可以封装下,达到每次跳转不需要传this或者XXXXX.this这种参数:

这些方法还是很便捷的,使用时可以简单的使用startActivity(MainActivity.class);,也可以传Bundle参数。

是否允许全屏

设置一个成员变量mAllowFullScreen

通过在BaseActivity的onCreate方法里判断mAllowFullScreen来设置是否允许全屏:

然后给子类暴露一个方法来设置mAllowFullScreen:

设置沉浸式状态栏

跟设置全屏一样一样的:

然后BaseActivity的onCreate里:

然后定义steepStatusBar()方法,用来设置沉浸式状态栏:

这里就要判断系统版本了。只有在KITKAT以上才有作用。

最后给子类暴露方法,设置 isSetStatusBar的值:

设置是否允许屏幕旋转

跟前面两种思路一样,通过判断变量,在onCreate里设置咯:

BaseActivity里的onCreate方法:

最后暴露方法设置isAllowScreenRoate的值:

总结

上面的这些方法大都是比较常用的,有些虽然不是很常用,但是写了也会方便一点,把这篇文章当做一个汇总,然后按需使用呗。

android 基类BaseFragment的简单使用

目的: 当有多个Fragment使用时,提供一个抽象基类BaseFragment, 来封装一下方法,使其Fragment的使用简单化。

解决问题:

1: 使用getActivtiy() 为空的情况,

2: 简化了onCreateView, 只需要提供布局id就好了

像添加和移除fragment的情况,这里没有列出,后续。。。

如果有什么其他好的意见的,希望留言,一起学习,谢谢!


当前文章:android基类,android开发基础知识
文章源于:http://www.cdkjz.cn/article/dscghso.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220