Android應用開發—知識點匯總

  • 獲取Fragment的context:
   getActivity().getApplicationContext()或者getActivity()You can use getActivity(), which returns the activity associated with a fragment.The activity is a context (since Activity extends Context).
  • 設置TextView的顏色setTextColor()的用法:
 setTextColor(0xff999faa);setTextColor(Color.parseColor("#999faa"))
  • Android textView 動態設置字體大小,帶單位:
setTextSize(TypedValue.COMPLEX_UNIT_PX,22); 
setTextSize(TypedValue.COMPLEX_UNIT_SP,22); 
setTextSize(TypedValue.COMPLEX_UNIT_DIP,22);
  • 初始化一個ArrayList<>并賦值:
ArrayList<String> list = new ArrayList<String>() {{add("string1"); add("string2"); add("string3");}}
  • setBackgroundDrawable和setBackgroundResource的區別:
setBackgroundXXX的用處,設置View背景。
setBackgroundDrawable的參數為Drawable對象。
setBackgroundColor的參數為Color對象,比如說Color.Red為紅色或  Color.rgb(255,0,0)來指定一個紅色
setBackgroundResource的參數為資源ID,比如說R.drawable.icon對于ImageView類有類似 setImageXXX
道理同上,setImageBitmap的參數為Bitmap對象,同時ImageView還支持矩陣對象,比如setImageMatrix的參數為Matrix對象。
  • Android延時執行接口:
new Handler().postDelayed(new Runnable(){@Overridepublic void run() {func();}
}, 250);
  • 查看Android系統服務命令:
adb shell service list
  • Activity有三種基本狀態:
  • Active:處于屏幕前景(當前task的棧頂Activity處于Active狀態),同一時刻只能有一個Activity處于Active狀態。
  • Paused狀態:處于背景畫面畫面狀態,失去了焦點,但依然是活動狀態。
  • Stopped:不可見,但依然保持所有的狀態和內存信息。
  • 同一個Service的類在android中可以有多個實例嗎?
    不可以。Service的啟動模式決定它不會在系統中存在多個實例,當有新的Intent傳遞過來的時候,android系統會直接使用已經存在的Service實例而不會重新創建,所以在android系統中的Service都是單例的。

但為什么在錘子手機上有好幾個xstate service???

  • android繼承activity和application有什么不同:
    初學安卓,看到有些代碼繼承activity,有些繼承application,不知有什么?
    Activty是UI界面的抽象,Application是應用程序的抽象。一個Application有若干個Activity組成。一般繼承Application主要是做一些初始化以及獲取全局Context的引用,每個用戶界面都要繼承自Acitivity。

  • Fragment中調用startActivityForResult:
    注意要采用fragment的startActivityForResult,而不要通過activity調用,否則activity的onActivityResult回被回調,fragment不會被調用,這樣start和onResult就分離了。
    目前還沒有遇到這個問題,先收藏著
    徹底搞懂startActivityForResult在FragmentActivity和Fragment中的異同
    淺談Android Fragment嵌套使用存在的一些BUG以及解決方法

  • 去除字符串中的標點符號

public static String removePunct(String s) {String str = s.replaceAll("[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……& amp;*()——+|{}【】‘;:”“’。,、?|-]", "");str = str.replace("\"", "");return str;
}
  • 判斷字符串中是否都是中文字符
public static boolean isChinese(String string) {String regex = "^[\u4E00-\u9FA5]+$";Pattern pattern = Pattern.compile(regex);Matcher match = pattern.matcher(string);return match.matches();}
  • 令人厭惡的Bundles

摘錄自Android 中 EventBus 的使用(2):緩存事件

“我在上一篇文章中曾說過,我并不喜歡Android中的Bundle,而且盡量避免使用它們。我不喜歡被象Serializable或者是Parcelable這類對象所約束,尤其是它們還缺少對類型安全的檢查。我的意思是必竟這是Java,而不是Python或者Javascript什么的。我希望我的IDE能夠發現并告訴我這樣的錯誤,如一個組件向另外一個組件發送了一個不是它期望的對象類型。
不要誤會,Intent在進程間通信時還是很有用的,在這種情況下將攜帶的數據序列化成通用格式是合情合理的。但如果僅僅是為了在用戶旋轉了一下屏幕后,讓程序保持原來的狀態,以科學的名義說,有必要非得用這種方法么?沒錯,我說的就是Android提供的處理配置改變的標準模式——在onSaveInstanceState(Bundle bundle)和onRestoreInstanceState(Bundle bundle)中保存和恢復狀態數據。且不提那些荒唐復雜的Fragment生命周期問題,單單是保持運行狀態的這種處理方式就是我最不喜歡的Android開發特點之一。”

剛剛遇到了類似問題:Parcel android.os.Parcel@dbaf03f: Unmarshalling unknown type code 2131625126 at offset 1308 導致了crash

XXXX info = mXXXXList.get(position);
if (info == null) {return;
}
Intent intent = new Intent(XXXXActivity.this, XXXXActivity.class);
intent.putExtra(XXX.KEY_SOUND_INFO, info);if (intent != null) {mXXXX = (XXXX) intent.getSerializableExtra(XXX.KEY_SOUND_INFO);
}

由于Serializable導致的問題,出現幾率比較小,目前還沒找到原因。

  • AsyncTask, Loader和Executor…… 拜托!

摘錄自Android 中 EventBus 的使用(3):多線程事件處理

Android中有很多種執行異步操作的方法(指平行于UI線程的)。AsyncTask對于用戶來說是最簡單的一種機制,并且只需要少量的設置代碼即可。然而,它的使用是有局限的,正如Android官方文檔中所描述的:

AsyncTask被設計成為一個工具類,在它內部包含了Thread和Handler,但它本身并不是通用線程框架的一部分。AsyncTask應該盡可能地被用在執行一些較短的操作中(最多幾秒)。如果你需要在線程中執行較長時間的任務,那么建議你直接使用java.util.concurrent包中提供的各種API,如Executor、 ThreadPoolExecutor以及FutureTask。

不過即便是執行短時間的操作也會帶來一些問題,特別是在與Activity/Fragment生命周期有關的地方。由于AsyncTask會持續地運行下去(即使啟動它們的Activity/Fragment已經被銷毀了)。這樣,一旦你在onPostExecute方法中試圖對UI進行更新,那么最終將導致拋出一個IllegalStateException異常。

Android 3.0中引入了Loader API用來解決Activity/Fragment生命周期的問題(它們的確很有效)。Loader API被設計成向Activity/Fragment中以異步方式加載數據。盡管加載數據是一種非常常見的異步操作,但并非唯一一種需要從UI線程中分開的操作。Loader還需要在Activity/Fragment中實現另外一個監聽接口。盡管這么做沒有錯,但我個人并不喜歡這種模式(我的意思是最終你的代碼中會包含許多的回調函數,導致代碼的可讀性變得很差)。最后,Activity和Fragment也并非唯一需要對異步操作分線程的地方。例如如果在Service里,你就不能訪問LoaderManager,所以最終你還是得使用AsyncTask或者java.util.concurrent。

java.util.concurrent包很不錯,我在Android和非Android項目中都可以使用。不過使用時需要對其進行多一點兒配置和管理,不象AsyncTask那么簡單。你需要對ExecutorService進行初始化,管理和監視它的生命周期,并且可能需要跟一些Future對象打交道。

只要使用恰當,AsyncTask、 Loader和Executor都是非常有效的。但在復雜應用中,需要為每個任務選擇合適的工具,最終你可能三種都會用到。這樣你就得維護三種不同的處理并發的框架代碼。

  • RelativeLayout布局內組件設置居中
    備忘
android:layout_centerVertical="true"
  • 設置漸變色的背景
    設置背景色可以通過在res/drawable里定義一個xml,如下:
xxx.xml<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><item><shape><gradientandroid:angle="0"android:endColor="#28d5fa"android:startColor="#0083fa"android:type="linear" /></shape></item></layer-list>

引用:

<RelativeLayoutandroid:id="@+id/va_voice_print_step_ll"android:layout_width="match_parent"android:layout_height="149dp"android:background="@drawable/xxx">
</RelativeLayout>

shape:定義形狀(主要包括方形、圓形等);gradient:定義該形狀里面為漸變色填充;startColor:起始顏色;endColor:結束顏色;angle:表示方向角度。(當angle=0時,漸變色是從左向右。 然后逆時針方向轉,當angle=90時為從下往上)。

gradient主要配置起點顏色、終點顏色、中間點的坐標、中間點的顏色、漸變角度(90度為上下漸變,0為左右漸變);
padding主要配置上下左右邊距;
corners節點配置四周園角的半徑;
參考鏈接:Android (shape,gradient)使用總結,android 背景漸變色(shape,gradient)

  • 如果在Android中判斷某個線程是否是主線程?
public static boolean isInMainThread() {return Looper.myLooper() == Looper.getMainLooper();
}
  • EditText中灰色文字提示
android:hint="請輸入xx"
  • 如何查看Activity Task棧的情況
adb shell dumpsys activity activities
adb shell dumpsys activity top
  • 打開app對應設置通知中心
public void openNotificationSettings() {try {Intent intent = new Intent();intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS");if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) {intent.putExtra("android.provider.extra.APP_PACKAGE", context.getPackageName());} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {intent.putExtra("app_package", context.getPackageName());intent.putExtra("app_uid", context.getApplicationInfo().uid);}intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent);} catch (Exception e) {e.printStackTrace();}
}
  • gradle里面的cached module文件位置
~/.gradle/caches/modules-2/files-2.1/com.ali*
  • 判斷app是否在前臺運行
 public boolean isAppOnForeground() {// Returns a list of application processes that are running on the// deviceActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);String packageName = getApplicationContext().getPackageName();List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();if (appProcesses == null)return false;for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {// The name of the process that this object is associated with.if (appProcess.processName.equals(packageName)&& appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {return true;}}return false;
}
  • Activity內使用Broadcast接收消息

大部分的Broadcast示例都是新建一個class繼承BroadcastReceiver來說明Broadcast的使用,但是這個class中接收到的消息,如何進行后續處理呢?其實大部分情況下是希望在activity中通過Broadcast接收消息,做一些后續的處理工作,而如果在一個新建的繼承自BroadcastReceiver的class中,如何和某個Activity通訊,這是一個悖論,消息發生源傳遞給Broadcast,Broadcast再傳遞給Activity,后一步要采用什么通訊方式呢?為什么不消息發生源不直接發生消息給Activity呢?

由于大部分示例都是在一個新的class中進行,導致我一度認為Broadcast只能寫在class里。后來發現可以通過動態注冊的方式直接new一個BroadcastReceiver的方式,寫在Activity內部,由于BroadcastReceiver在Activity內部,BroadcastReceiver中onReceive()即可操作Activity內數據和控件,實現Activity接受消息的目的。

private BroadcastReceiver mSearchRequestReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {//do somethings}}};@Overridepublic void onResume() {super.onResume();LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);lbm.registerReceiver(mSearchRequestReceiver, new IntentFilter(SEARCH_REQUEST_BROADCAST_ACTION));}@Overrideprotected void onPause() {super.onPause();LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);lbm.unregisterReceiver(mSearchRequestReceiver);}
  • 判斷當前線程是否是Ui線程:
public static boolean isMainThread() {return Thread.currentThread() == Looper.getMainLooper().getThread();
}
  • Glide.with()使用
with(Context context):使用Application上下文,Glide請求將不受Activity/Fragment生命周期控制。
with(Activity activity):使用Activity作為上下文,Glide的請求會受到Activity生命周期控制。
with(FragmentActivity activity):Glide的請求會受到FragmentActivity生命周期控制。
with(android.app.Fragment fragment):Glide的請求會受到Fragment 生命周期控制。
with(android.support.v4.app.Fragment fragment):Glide的請求會受到Fragment生命周期控制。
  • HashMap的遍歷

從上面的分析來看:
a. HashMap的循環,如果既需要key也需要value,直接用

Map<String, String> map = new HashMap<String, String>();
for (Entry<String, String> entry : map.entrySet()) {entry.getKey();entry.getValue();
}

即可,foreach簡潔易懂。
b. 如果只是遍歷key而無需value的話,可以直接用

Map<String, String> map = new HashMap<String, String>();
for (String key : map.keySet()) {// key process
}
  • 自定義view常見問題:

Caused by: java.lang.NoSuchMethodException: [class android.content.Context, interface android.util.AttributeSet]

自定義View時,要同時覆寫

public XXXX(Context context) {super(context);
}/*** 自定義View時,如果自定義View有屬性,這個方法一定要覆寫!!** @param context* @param attrs*/
public XXXX(Context context, AttributeSet attrs) {super(context, attrs);
}
  • Android 文件鎖 FileLock
 Android 中 FileLock 只支持進程間死鎖,同一進程不同線程是無效的。
  • 判斷當前應用是否是debug狀態
/*** 判斷當前應用是否是debug狀態*/
public static boolean isApkInDebug(Context context) {try {ApplicationInfo info = context.getApplicationInfo();return (info.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;} catch (Exception e) {return false;}
}
  • 查詢10秒鐘前應用使用統計數據并根據最后使用時間進行排序,得到的最后使用的應用
    public static String getTopActivityPackageName(@NonNull Context context) {final UsageStatsManager usageStatsManager = (UsageStatsManager)context.getSystemService(Context.USAGE_STATS_SERVICE);if(usageStatsManager == null) {return PACKAGE_NAME_UNKNOWN;}String topActivityPackageName = PACKAGE_NAME_UNKNOWN;long time = System.currentTimeMillis();// 查詢最后十秒鐘使用應用統計數據List<UsageStats> usageStatsList = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000*10, time);// 以最后使用時間為標準進行排序if(usageStatsList != null) {SortedMap<Long,UsageStats> sortedMap = new TreeMap<Long,UsageStats>();for (UsageStats usageStats : usageStatsList) {sortedMap.put(usageStats.getLastTimeUsed(),usageStats);}if(sortedMap.size() != 0) {topActivityPackageName =  sortedMap.get(sortedMap.lastKey()).getPackageName();Log.d(TAG,"Top activity package name = " + topActivityPackageName);}}return topActivityPackageName;}```

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450204.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450204.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450204.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

條件渲染vue

v-if:只渲染一次的情況下&#xff0c;性能更好v-show:頻繁切換性能更好 vue虛擬DOM技術 瀏覽器&#xff1a;渲染引擎&#xff08;慢&#xff09;JS引擎&#xff08;快&#xff09; 用1個JS對象來充當DOM對象&#xff0c;因為JS對象性能比較快&#xff0c;所以用虛擬DOM對象進行…

錢線觀察:貨幣基金T+0駕到 活期存款將死?

導語&#xff1a;即使沒有任何投資風險&#xff0c;通脹也在侵蝕居民的財富&#xff0c;現金是不安全的。最近出現的一項業務&#xff0c;貨幣基金"T0"贖回&#xff0c;意味著貨幣基金可以像活期存款一樣即時取現&#xff0c;而其收益率普遍高于活期存款。因此有人認…

git stash和git stash pop

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 git stash 可用來暫存當前正在進行的工作&#xff0c; 比如想pull 最新代碼&#xff0c; 又不想加新commit&#xff0c; 或者另外一種情…

CentOS 7.0 上安裝和配置 VNC 服務器

作為一個系統管理員&#xff0c;大多數時間是通過網絡管理服務器的。在管理服務器的過程中很少會用到圖形界面&#xff0c;多數情況下我們只是用 SSH 來完成我們的管理任務。在這篇文章里&#xff0c;我們將配置 VNC 來提供一個連接我們 CentOS 7 服務器的方法。VNC 允許我們開…

Android應用開發—TextView的動態創建

動態創建TextView的兩種方式&#xff1a; 下面介紹兩種創建方式&#xff1a; 在drawable里面創建共同依賴的background.xml文件&#xff0c;里面設置shape來設置文本框的一些特殊效果&#xff1a; eg&#xff1a; <?xml version"1.0" encoding"utf-8"…

Mongo DB 簡單搭建和部署

1.先下載源代碼包 官網下載地址&#xff1a;http://www.mongodb.org/downloads 2.解包tar xf mongodb-linux-x86_64-rhel62-3.2.7.tgz 3.把包移動到 /usr/local/mongodb mv mongodb-linux-x86_64-rhel62-3.2.7/ /usr/local/mongodb 指定同一時間最多可開啟的文件數&#xff08…

運算符優先級 必熟記,放到心里

優先級 運算符 名稱或含義 使用形式 結合方向 說明 1 [] 數組下標 數組名[常量表達式] 左到右 () 圓括號 &#xff08;表達式&#xff09;/函數名(形參表) . 成員選擇&#xff08;對象&#xff09; 對象.成員名 -> 成員選擇&#xff08;指針&#xff0…

可持久化平衡樹(FHQ Treap)

兩個最基本的操作 merge合并 split分割 merge 把兩棵treap合并成一棵treap&#xff0c;要滿足T1最大值要比T2最小值小&#xff0c;比較將隨機數值key值更大的作為合并后的根 假設T1作為根節點作為新子樹的根&#xff0c;左子樹不變&#xff0c;右子樹對T1原來的右子樹與T2再遞歸…

Git 分支管理-git stash 和git stash pop

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 合并分支&#xff0c;沖突是難免的&#xff0c;在實際協作開發中我們遇到的情況錯綜復雜&#xff0c;今天就講兩個比較重要的命令使用gi…

useState語法講解

useState語法講解 語法定義 const [state, dispatch] useState(initData)state&#xff1a;定義的數據源&#xff0c;可視作一個函數組件內部的變量&#xff0c;但只在首次渲染被創造。dispatch&#xff1a;改變state的函數&#xff0c;推動函數渲染的渲染函數。dispatch有兩…

NSOperation的進階使用和簡單探討

本文將會從多個方面探討NSOperation類和NSOperationQueue類的相關內容 一、簡介 NSOperation類是iOS2.0推出的&#xff0c;通過NSThread實現的,但是效率一般。 從OS X10.6和iOS4推出GCD時&#xff0c;又重寫了NSOperation和NSOperationQueue&#xff0c;NSOperation和NSOperati…

Android應用開發—LayoutParams的用法

Android應用開發—TextView的動態創建 這篇文章講到了“TextView控件布局位置的控制”&#xff0c;主要依賴于RelativeLayout.LayoutParams的使用&#xff0c;本文簡單介紹下LayoutParams的用法 注&#xff1a;本文大部分內容參考android,利用layoutParams代碼動態布局空間位置…

廖雪峰Java1-2程序基礎-7布爾運算符

布爾運算符 關系運算符&#xff1a;>&#xff0c; >&#xff0c; <&#xff0c; <&#xff0c; &#xff0c;!與運算 &&或運算 |非運算 &#xff01;int n 5;boolean t n > 0;//trueboolean f n < 0;//falseboolean isFive n 5;//trueboolean i…

第二十一屆國際C語言混亂代碼大賽結果公布

摘要&#xff1a;國際C語言混亂代碼大賽&#xff08;IOCCC, The International Obfuscated C Code Contest&#xff09;是一項著名的國際編程賽事&#xff0c;從1984年開始到2006年&#xff0c;每年舉辦一次。2006年后中止了多年&#xff0c;2011年又開始恢復。比賽的目的是寫出…

QuartZ Cron表達式

CronTrigger 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 CronTriggers往往比SimpleTrigger更有用&#xff0c;如果您需要基于日歷的概念&#xff0c;而非SimpleTrigger完全指定的時間…

maven02-----Maven項目構建的初次使用

一. 創建Maven項目 1.1 建立一個Hello項目 當然也可以通過java project的方式創建符合Maven約定的目錄結果的項目&#xff0c;并手動建立pom.xml文件&#xff0c;但是太繁瑣了。因此&#xff0c;這里直接建立maven項目。note: eclipse有內建的maven項目創建功能&#xff0c;倘若…

微軟超過蘋果 成為全球第一大市值公司

11月23日周五盤中至收盤&#xff0c;微軟市值正式超過蘋果&#xff0c;成為世界上市值最高的公司。收盤時&#xff0c;微軟市值為7533.4億美元&#xff0c;蘋果市值為7468.2億美元&#xff0c;亞馬遜市值為7366.2億美元&#xff0c;谷歌市值為7255.2億美元。 上次蘋果與微軟市值…

創新大賽成就創業夢想 超30%入榜應用獲投資意向

摘要&#xff1a;騰訊開放平臺宣布移動應用賽區正式開啟&#xff0c;新一輪的創業夢想正在成長中。據悉&#xff0c;在騰訊開放平臺應用創新大賽中誕生了多款DAU&#xff08;日活躍用戶數&#xff09;超百萬的應用。小魚吃吃吃、開心泡泡貓等引領社交游戲潮流&#xff0c;視頻達…