當前位置:首頁 » 安卓系統 » Android類的基類

Android類的基類

發布時間: 2022-09-18 04:46:20

㈠ Android 基類BaseActivity的封裝

摘要
本篇總結了前人寫的BaseActivity,自己在開發過程中也添添補補,刪刪改改,現在總結下。

本篇很多知識借鑒和學習了知乎上iYng大大的回答,先感謝一波。順便上原文鏈接:
https://www.hu.com/question/47045239/answer/105086885

正文
一般來說,不同的項目的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為什麼要創建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. {

11.

12.@Override

13.protectedvoidonCreate(Bundle savedInstanceState) {

14.super.onCreate(savedInstanceState);

15.setContentView(R.layout.activity_main);

16.iniView();

17.}

18.

19.@Override

20.voidiniView() {

21.mContext =this;

22.validateInternet();

23.PushNotification(R.drawable.ic_launcher,"測試","內容測試", OtherActivity.class,

24."嘻嘻");

25.}

26.

27.}


經過幾層抽象,我們可以看到,代碼的擴展性和耦合性確實得到了一定的改善,這篇文章只針對菜鳥,如果有牛人有幸可以看到這篇文章,還希望可以指教一二!

㈢ android 基類BaseFragment的簡單使用

目的: 當有多個Fragment使用時,提供一個抽象基類BaseFragment, 來封裝一下方法,使其Fragment的使用簡單化。

解決問題:

1: 使用getActivtiy() 為空的情況,
2: 簡化了onCreateView, 只需要提供布局id就好了

像添加和移除fragment的情況,這里沒有列出,後續。。。

如果有什麼其他好的意見的,希望留言,一起學習,謝謝!

㈣ android annotations 怎麼寫baseactivity 基類

這個要看實際應用用到的功能模塊來提取,首先基類必須是抽象類,然後裡麵包含抽象方法,讓子類去實現。

㈤ Android為什麼要創建Activity基類以及Activity基類中一般有哪些方法

1、創建基類的原因:根本原因就是要減少重復的代碼。
2、有哪些方法:比如你的每個activity上都要顯示時間,你就可以把這個做到基類里去。然後每個activity都繼承基類,就都有時間了不用各個都寫。所以基類里就是寫共用的方法。
這樣 的好處首先代碼量少了,第二維護的時候方便,比如時間出了問題,就只需要改基類就行了不用各個activity都改。

㈥ 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 有沒有基類的概念

有啊,不過在android裡面我們叫父類或者抽象類

㈧ android 怎麼在基類里操作控制項

我們另外寫一個Activity的基類BaseActivity,這個類也是繼承自FinalActivity,而且在這個基類裡面我們可以實現一些公共的方法,這樣其他的Activity繼承自我們這個BaseActivity基類,既可以使用FinalActivity裡面封裝好的方法,也可以使用我們在BaseActivity裡面擴展的一些公共的方法。如果我們再抽象一層的話,我們可以把這些公共的方法抽象到一個介面裡面,然後我們的BaseActivity實現這個介面,這樣也可以實現程序的擴展。

下面貼一些我整理的一些代碼

首先是抽象出來的一個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里的封裝,繼承,多態,都是表現在哪裡,都是有什麼方法,有什麼

封裝,例如android中一個View就是封裝了一系列的方法,這些方法系統已經給你封裝好了,你只需要去調用即可。
繼承,例如一個Activity(界面),創建一個界面就需要去繼承它,因為android中每個界面都是一個activity組成的(Fragment也是運行在activity中的)。
多態,這個比較抽象也比較難解釋,就像一個View,給它注冊一個點擊事件來說吧,系統用的只是一個介面,但是用戶可以用一個實現介面的類來處理這個點擊事件,這就是多態性,因為對於android來講,它根本不知道用戶會起個什麼名實的類,它只要你實現它的介面即可。

㈩ 選題android對話框的基類是什麼 a,infodialog b,alertdialog c,dialog d,sysdi

是dialog
Dialog(AlertDialog、ProgressDialog、TimePickerDialog、DatePickerDialog)提示對話框、進度對話框、時間選擇對話框、日期選擇對話框

熱點內容
如何製作原始傳奇腳本 發布:2025-01-10 23:00:30 瀏覽:117
小程序免費模板源碼下載 發布:2025-01-10 22:55:23 瀏覽:233
gradle編譯jar 發布:2025-01-10 22:54:36 瀏覽:796
伺服器搭建棋牌游戲 發布:2025-01-10 22:53:49 瀏覽:642
java記事本程序 發布:2025-01-10 22:38:27 瀏覽:666
如何通過網吧電腦進入網吧伺服器 發布:2025-01-10 22:22:30 瀏覽:706
資料庫緩存是什麼 發布:2025-01-10 22:21:05 瀏覽:386
dns配置出現錯誤該怎麼辦 發布:2025-01-10 22:13:00 瀏覽:439
雲頂演算法 發布:2025-01-10 22:10:07 瀏覽:991
收件伺服器有什麼作用 發布:2025-01-10 21:50:01 瀏覽:391