亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解Android中BroadCastReceiver組件

 更新時(shí)間:2016年02月26日 15:02:35   作者:徐劉根  
這篇文章主要為大家詳細(xì)介紹了Android中BroadCastReceiver組件,Broadcast Receiver是Android的五大組件之一,使用頻率也很高,用于異步接收廣播Intent,感興趣的小伙伴們可以參考一下

BroadcastReceiver也就是“廣播接收者”的意思,它是用來(lái)接收來(lái)自系統(tǒng)和應(yīng)用中的廣播。

在Android中,Broadcast是一種廣泛運(yùn)用的在應(yīng)用程序之間傳輸信息的機(jī)制。而B(niǎo)roadcastReceiver是對(duì)發(fā)送出來(lái)的 Broadcast進(jìn)行過(guò)濾接受并響應(yīng)的一類(lèi)組件。

下面將詳細(xì)的闡述如何發(fā)送Broadcast和使用BroadcastReceiver過(guò)濾接收的過(guò)程:

(1)首先在需要發(fā)送信息的地方,把要發(fā)送的信息和用于過(guò)濾的信息(如Action、Category)裝入一個(gè)Intent對(duì)象,然后通過(guò)調(diào)用 sendOrderBroadcast()或sendStickyBroadcast()方法,把 Intent對(duì)象以廣播方式發(fā)送出去。

(2)當(dāng)Intent發(fā)送以后,所有已經(jīng)注冊(cè)的BroadcastReceiver會(huì)檢查注冊(cè)時(shí)的IntentFilter是否與發(fā)送的Intent相匹配,若匹配則就會(huì)調(diào)用BroadcastReceiver的onReceive()方法。所以當(dāng)我們定義一個(gè)BroadcastReceiver的時(shí)候,都需要實(shí)現(xiàn)onReceive()方法。

注冊(cè)BroadcastReceiver有兩種方式

靜態(tài)注冊(cè):在AndroidManifest.xml中用標(biāo)簽生命注冊(cè),并在標(biāo)簽內(nèi)用標(biāo)簽設(shè)置過(guò)濾器。

<receiver android:name="myRecevice">  //繼承BroadcastReceiver,重寫(xiě)onReceiver方法
    <intent-filter>  
      <action android:name="com.lc.test"/> //使用過(guò)濾器,接收指定action廣播
     </intent-filter>
  </receiver> 

動(dòng)態(tài)注冊(cè): 使用IntentFilter在代碼中動(dòng)態(tài)的注冊(cè)一個(gè)廣播

 IntentFilter intentFilter = new IntentFilter();
 //為BroadcastReceiver指定action,使之用于接收同action的廣播
 intentFilter.addAction(String);  
 registerReceiver(BroadcastReceiver,intentFilter);

 另外值得注意的是,當(dāng)我們使用動(dòng)態(tài)注冊(cè)時(shí)候,當(dāng)這個(gè)Activity或Service被銷(xiāo)毀時(shí)如果沒(méi)有解除注冊(cè),系統(tǒng)會(huì)報(bào)一個(gè)異常,提示我們是否忘記解除注冊(cè)了,所以我們需要在onDestroy()方法中進(jìn)行解除注冊(cè),一般:在onStart中注冊(cè),onStop中取消unregisterReceiver:

@Override 
protected void onDestroy() { 
  super.onDestroy(); 
  unregisterReceiver(receiver); 
}

  指定廣播目標(biāo)Action:Intent intent = new Intent(actionString);

  并且可通過(guò)Intent攜帶消息 :intent.putExtra(“msg”, “hi,我通過(guò)廣播發(fā)送消息了”);

  發(fā)送廣播消息:Context.sendBroadcast(intent )

其中在動(dòng)態(tài)注冊(cè)中可將BroadcastReceiver的繼承類(lèi)進(jìn)行封裝,添加構(gòu)造函數(shù)和BroadcastReceiver注冊(cè)

BroadcastReceiver的案例演示

首先我們創(chuàng)建一個(gè)類(lèi)MyBroadcastReceiver用于繼承BroadcastReceiver:
這里重寫(xiě)了一個(gè)方法就是接受廣播的意圖并匹配:

//定義的為:public static final String //ACTION_REGISTER_SUCCESS_FINISH="register.success.finish";
Constants.ACTION_REGISTER_SUCCESS_FINISH.equals(intent.getAction())

這里是常量:定義如下:

public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
      if (intent != null && Constants.ACTION_REGISTER_SUCCESS_FINISH.equals(intent.getAction())) {
        finish();
      }
    }
  }

(1)接下里我們就通過(guò)“動(dòng)態(tài)注冊(cè)”的方式使用:

 private MyBroadcastReceiver receiver = new MyBroadcastReceiver();
    IntentFilter filter = new IntentFilter();
    filter.addAction(BmobConstants.ACTION_REGISTER_SUCCESS_FINISH); //添加action
    registerReceiver(receiver, filter); //注冊(cè)

(2)靜態(tài)注冊(cè)的話(huà)是現(xiàn)在清單文件中添加:

<receiver android:name=".MyBroadcastReceiver"> 
      <intent-filter> 
        <action android:name="register.success.finish"/> 
        <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 
    </receiver> 

(2-1)我們就可以使用代碼了:

Intent intent = new Intent("register.success.finish"); 
intent.putExtra("msg", "hello receiver."); 
sendBroadcast(intent); //發(fā)送廣播

普通廣播(Normal Broadcast)

普通廣播對(duì)于多個(gè)接收者來(lái)說(shuō)是完全異步的,通常每個(gè)接收者都無(wú)需等待即可以接收到廣播,接收者相互之間不會(huì)有影響。對(duì)于這種廣播,接收者無(wú)法終止廣播,即無(wú)法阻止其他接收者的接收動(dòng)作。為了驗(yàn)證以上論斷,我們新建三個(gè)BroadcastReceiver,演示一下這個(gè)過(guò)程,F(xiàn)irstReceiver、SecondReceiver和ThirdReceiver的代碼如下:

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 

public class FirstReceiver extends BroadcastReceiver { 

  private static final String TAG = "NormalBroadcast"; 

  @Override 
  public void onReceive(Context context, Intent intent) { 
    String msg = intent.getStringExtra("msg"); 
    Log.i(TAG, "FirstReceiver: " + msg); 
  } 
} 

public class SecondReceiver extends BroadcastReceiver { 

  private static final String TAG = "NormalBroadcast"; 

  @Override 
  public void onReceive(Context context, Intent intent) { 
    String msg = intent.getStringExtra("msg"); 
    Log.i(TAG, "SecondReceiver: " + msg); 
  } 
} 

public class ThirdReceiver extends BroadcastReceiver { 

  private static final String TAG = "NormalBroadcast"; 

  @Override 
  public void onReceive(Context context, Intent intent) { 
    String msg = intent.getStringExtra("msg"); 
    Log.i(TAG, "ThirdReceiver: " + msg); 
  } 
} 

然后再次點(diǎn)擊發(fā)送按鈕,發(fā)送一條廣播,控制臺(tái)打印如下:

看來(lái)這三個(gè)接收者都接收到這條廣播了,我們稍微修改一下三個(gè)接收者,在onReceive方法的最后一行添加以下代碼,試圖終止廣播:

abortBroadcast(); 

再次點(diǎn)擊發(fā)送按鈕,我們會(huì)發(fā)現(xiàn),控制臺(tái)中三個(gè)接收者仍然都打印了自己的日志,表明接收者并不能終止廣播。

有序廣播(Ordered Broadcast)

有序廣播比較特殊,它每次只發(fā)送到優(yōu)先級(jí)較高的接收者那里,然后由優(yōu)先級(jí)高的接受者再傳播到優(yōu)先級(jí)低的接收者那里,優(yōu)先級(jí)高的接收者有能力終止這個(gè)廣播。
為了演示有序廣播的流程,我們修改一下上面三個(gè)接收者的代碼,如下:

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 

public class FirstReceiver extends BroadcastReceiver { 

  private static final String TAG = "OrderedBroadcast"; 

  @Override 
  public void onReceive(Context context, Intent intent) { 
    String msg = intent.getStringExtra("msg"); 
    Log.i(TAG, "FirstReceiver: " + msg); 

    Bundle bundle = new Bundle(); 
    bundle.putString("msg", msg + "@FirstReceiver"); 
    setResultExtras(bundle); 
  } 
} 

public class SecondReceiver extends BroadcastReceiver { 

  private static final String TAG = "OrderedBroadcast"; 

  @Override 
  public void onReceive(Context context, Intent intent) { 
    String msg = getResultExtras(true).getString("msg"); 
    Log.i(TAG, "SecondReceiver: " + msg); 

    Bundle bundle = new Bundle(); 
    bundle.putString("msg", msg + "@SecondReceiver"); 
    setResultExtras(bundle); 
  } 
}
public class ThirdReceiver extends BroadcastReceiver { 

  private static final String TAG = "OrderedBroadcast"; 

  @Override 
  public void onReceive(Context context, Intent intent) { 
    String msg = getResultExtras(true).getString("msg"); 
    Log.i(TAG, "ThirdReceiver: " + msg); 
  } 
} 

我們注意到,在FirstReceiver和SecondReceiver中最后都使用了setResultExtras方法將一個(gè)Bundle對(duì)象設(shè)置為結(jié)果集對(duì)象,傳遞到下一個(gè)接收者那里,這樣以來(lái),優(yōu)先級(jí)低的接收者可以用getResultExtras獲取到最新的經(jīng)過(guò)處理的信息集合。
代碼改完之后,我們需要為三個(gè)接收者注冊(cè)廣播地址,我們修改一下AndroidMainfest.xml文件:

<receiver android:name=".FirstReceiver"> 
  <intent-filter android:priority="1000"> 
    <action android:name="android.intent.action.MY_BROADCAST"/> 
    <category android:name="android.intent.category.DEFAULT" /> 
  </intent-filter> 
</receiver> 
<receiver android:name=".SecondReceiver"> 
  <intent-filter android:priority="999"> 
    <action android:name="android.intent.action.MY_BROADCAST"/> 
    <category android:name="android.intent.category.DEFAULT" /> 
  </intent-filter> 
</receiver> 
<receiver android:name=".ThirdReceiver"> 
  <intent-filter android:priority="998"> 
    <action android:name="android.intent.action.MY_BROADCAST"/> 
    <category android:name="android.intent.category.DEFAULT" /> 
  </intent-filter> 
</receiver> 

我們看到,現(xiàn)在這三個(gè)接收者的多了一個(gè)android:priority屬性,并且依次減小。這個(gè)屬性的范圍在-1000到1000,數(shù)值越大,優(yōu)先級(jí)越高。
現(xiàn)在,我們需要修改一下發(fā)送廣播的代碼,如下:

public void send(View view) { 
  Intent intent = new Intent("android.intent.action.MY_BROADCAST"); 
  intent.putExtra("msg", "hello receiver."); 
  sendOrderedBroadcast(intent, "scott.permission.MY_BROADCAST_PERMISSION"); 
} 

注意,使用sendOrderedBroadcast方法發(fā)送有序廣播時(shí),需要一個(gè)權(quán)限參數(shù),如果為null則表示不要求接收者聲明指定的權(quán)限,如果不為null,則表示接收者若要接收此廣播,需聲明指定權(quán)限。這樣做是從安全角度考慮的,例如系統(tǒng)的短信就是有序廣播的形式,一個(gè)應(yīng)用可能是具有攔截垃圾短信的功能,當(dāng)短信到來(lái)時(shí)它可以先接受到短信廣播,必要時(shí)終止廣播傳遞,這樣的軟件就必須聲明接收短信的權(quán)限。
所以我們?cè)贏ndroidMainfest.xml中定義一個(gè)權(quán)限:

<permission android:protectionLevel="normal" 
      android:name="scott.permission.MY_BROADCAST_PERMISSION" /> 

然后聲明使用了此權(quán)限:

<uses-permission android:name="scott.permission.MY_BROADCAST_PERMISSION" /> 

關(guān)于這部分如果有不明白的地方可以參考我之前寫(xiě)過(guò)的一篇文章:Android聲明和使用權(quán)限
然后我們點(diǎn)擊發(fā)送按鈕發(fā)送一條廣播,控制臺(tái)打印如下:

我們看到接收是按照順序的,第一個(gè)和第二個(gè)都在結(jié)果集中加入了自己的標(biāo)記,并且向優(yōu)先級(jí)低的接收者傳遞下去。
既然是順序傳遞,試著終止這種傳遞,看一看效果如何,我們修改FirstReceiver的代碼,在onReceive的最后一行添加以下代碼:

abortBroadcast(); 

然后再次運(yùn)行程序,控制臺(tái)打印如下:

此次,只有第一個(gè)接收者執(zhí)行了,其它兩個(gè)都沒(méi)能執(zhí)行,因?yàn)閺V播被第一個(gè)接收者終止了。
上面就是BroadcastReceiver的介紹,下面我將會(huì)舉幾個(gè)常見(jiàn)的例子加深一下大家對(duì)廣播的理解和應(yīng)用:

1.開(kāi)機(jī)啟動(dòng)服務(wù)

我們經(jīng)常會(huì)有這樣的應(yīng)用場(chǎng)合,比如消息推送服務(wù),需要實(shí)現(xiàn)開(kāi)機(jī)啟動(dòng)的功能。要實(shí)現(xiàn)這個(gè)功能,我們就可以訂閱系統(tǒng)“啟動(dòng)完成”這條廣播,接收到這條廣播后我們就可以啟動(dòng)自己的服務(wù)了。我們來(lái)看一下BootCompleteReceiver和MsgPushService的具體實(shí)現(xiàn):

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 

public class BootCompleteReceiver extends BroadcastReceiver { 

  private static final String TAG = "BootCompleteReceiver"; 

  @Override 
  public void onReceive(Context context, Intent intent) { 
    Intent service = new Intent(context, MsgPushService.class); 
    context.startService(service); 
    Log.i(TAG, "Boot Complete. Starting MsgPushService..."); 
  } 

} 

import android.app.Service; 
import android.content.Intent; 
import android.os.IBinder; 
import android.util.Log; 

public class MsgPushService extends Service { 

  private static final String TAG = "MsgPushService"; 

  @Override 
  public void onCreate() { 
    super.onCreate(); 
    Log.i(TAG, "onCreate called."); 
  } 

  @Override 
  public int onStartCommand(Intent intent, int flags, int startId) { 
    Log.i(TAG, "onStartCommand called."); 
    return super.onStartCommand(intent, flags, startId); 
  } 

  @Override 
  public IBinder onBind(Intent arg0) { 
    return null; 
  } 
} 

然后我們需要在AndroidManifest.xml中配置相關(guān)信息:

<!-- 開(kāi)機(jī)廣播接受者 --> 
<receiver android:name=".BootCompleteReceiver"> 
  <intent-filter> 
    <!-- 注冊(cè)開(kāi)機(jī)廣播地址--> 
    <action android:name="android.intent.action.BOOT_COMPLETED"/> 
    <category android:name="android.intent.category.DEFAULT" /> 
  </intent-filter> 
</receiver> 
<!-- 消息推送服務(wù) --> 
<service android:name=".MsgPushService"/> 

我們看到BootCompleteReceiver注冊(cè)了“android.intent.action.BOOT_COMPLETED”這個(gè)開(kāi)機(jī)廣播地址,從安全角度考慮,系統(tǒng)要求必須聲明接收開(kāi)機(jī)啟動(dòng)廣播的權(quán)限,于是我們?cè)俾暶魇褂孟旅娴臋?quán)限:
經(jīng)過(guò)上面的幾個(gè)步驟之后,我們就完成了開(kāi)機(jī)啟動(dòng)的功能,將應(yīng)用運(yùn)行在模擬器上,然后重啟模擬器,控制臺(tái)打印如下:

如果我們查看已運(yùn)行的服務(wù)就會(huì)發(fā)現(xiàn),MsgPushService已經(jīng)運(yùn)行起來(lái)了。

2.網(wǎng)絡(luò)狀態(tài)變化

在某些場(chǎng)合,比如用戶(hù)瀏覽網(wǎng)絡(luò)信息時(shí),網(wǎng)絡(luò)突然斷開(kāi),我們要及時(shí)地提醒用戶(hù)網(wǎng)絡(luò)已斷開(kāi)。要實(shí)現(xiàn)這個(gè)功能,我們可以接收網(wǎng)絡(luò)狀態(tài)改變這樣一條廣播,當(dāng)由連接狀態(tài)變?yōu)閿嚅_(kāi)狀態(tài)時(shí),系統(tǒng)就會(huì)發(fā)送一條廣播,我們接收到之后,再通過(guò)網(wǎng)絡(luò)的狀態(tài)做出相應(yīng)的操作。下面就來(lái)實(shí)現(xiàn)一下這個(gè)功能:

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.util.Log; 
import android.widget.Toast; 

public class NetworkStateReceiver extends BroadcastReceiver { 

  private static final String TAG = "NetworkStateReceiver"; 

  @Override 
  public void onReceive(Context context, Intent intent) { 
    Log.i(TAG, "network state changed."); 
    if (!isNetworkAvailable(context)) { 
      Toast.makeText(context, "network disconnected!", 0).show(); 
    } 
  } 

  /** 
   * 網(wǎng)絡(luò)是否可用 
   */ 
  public static boolean isNetworkAvailable(Context context) { 
    ConnectivityManager mgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo[] info = mgr.getAllNetworkInfo(); 
    if (info != null) { 
      for (int i = 0; i < info.length; i++) { 
        if (info[i].getState() == NetworkInfo.State.CONNECTED) { 
          return true; 
        } 
      } 
    } 
    return false; 
  } 
} 

再注冊(cè)一下這個(gè)接收者的信息:

<receiver android:name=".NetworkStateReceiver"> 
  <intent-filter> 
    <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> 
    <category android:name="android.intent.category.DEFAULT" /> 
  </intent-filter> 
</receiver> 

因?yàn)樵趇sNetworkAvailable方法中我們使用到了網(wǎng)絡(luò)狀態(tài)相關(guān)的API,所以需要聲明相關(guān)的權(quán)限才行,下面就是對(duì)應(yīng)的權(quán)限聲明:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 

我們可以測(cè)試一下,比如關(guān)閉WiFi,看看有什么效果。

3.電量變化

如果我們閱讀軟件,可能是全屏閱讀,這個(gè)時(shí)候用戶(hù)就看不到剩余的電量,我們就可以為他們提供電量的信息。要想做到這一點(diǎn),我們需要接收一條電量變化的廣播,然后獲取百分比信息,這聽(tīng)上去挺簡(jiǎn)單的,我們就來(lái)實(shí)現(xiàn)以下:

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.os.BatteryManager; 
import android.util.Log; 

public class BatteryChangedReceiver extends BroadcastReceiver { 

  private static final String TAG = "BatteryChangedReceiver"; 

  @Override 
  public void onReceive(Context context, Intent intent) { 
    int currLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); //當(dāng)前電量 
    int total = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 1);   //總電量 
    int percent = currLevel * 100 / total; 
    Log.i(TAG, "battery: " + percent + "%"); 
  } 

} 

然后再注冊(cè)一下廣播接地址信息就可以了:

<receiver android:name=".BatteryChangedReceiver"> 
  <intent-filter> 
    <action android:name="android.intent.action.BATTERY_CHANGED"/> 
    <category android:name="android.intent.category.DEFAULT" /> 
  </intent-filter> 
</receiver> 

當(dāng)然,有些時(shí)候我們是要立即獲取電量的,而不是等電量變化的廣播,比如當(dāng)閱讀軟件打開(kāi)時(shí)立即顯示出電池電量。我們可以按以下方式獲?。?/p>

Intent batteryIntent = getApplicationContext().registerReceiver(null, 
    new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 
int currLevel = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); 
int total = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, 1); 
int percent = currLevel * 100 / total; 
Log.i("battery", "battery: " + percent + "%"); 

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。

相關(guān)文章

  • Kotlin使用協(xié)程實(shí)現(xiàn)高效并發(fā)程序流程詳解

    Kotlin使用協(xié)程實(shí)現(xiàn)高效并發(fā)程序流程詳解

    這篇文章主要介紹了Kotlin使用協(xié)程實(shí)現(xiàn)高效并發(fā)程序流程,協(xié)程屬于Kotlin中非常有特色的一項(xiàng)技術(shù),因?yàn)榇蟛糠志幊陶Z(yǔ)言中是沒(méi)有協(xié)程這個(gè)概念的。那么什么是協(xié)程呢?它其實(shí)和線(xiàn)程有點(diǎn)相似,可以簡(jiǎn)單地將它理解成一種輕量級(jí)的線(xiàn)程
    2023-01-01
  • Android 單例模式的四種實(shí)現(xiàn)方式

    Android 單例模式的四種實(shí)現(xiàn)方式

    單例模式作為設(shè)計(jì)模式之一,使用場(chǎng)景非常多。本文講述了Android實(shí)現(xiàn)單例模式的幾種方式
    2021-05-05
  • 詳解Android PopupWindow怎么合理控制彈出位置(showAtLocation)

    詳解Android PopupWindow怎么合理控制彈出位置(showAtLocation)

    本篇文章主要介紹了詳解Android PopupWindow怎么合理控制彈出位置(showAtLocation),具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-10-10
  • Android開(kāi)發(fā)中setContentView和inflate的區(qū)別分析

    Android開(kāi)發(fā)中setContentView和inflate的區(qū)別分析

    這篇文章主要介紹了Android開(kāi)發(fā)中setContentView和inflate的區(qū)別,較為詳細(xì)的分析了setContentView和inflate的功能、用法及二者的區(qū)別,需要的朋友可以參考下
    2016-07-07
  • Android中ListView結(jié)合CheckBox實(shí)現(xiàn)數(shù)據(jù)批量選擇(全選、反選、全不選)

    Android中ListView結(jié)合CheckBox實(shí)現(xiàn)數(shù)據(jù)批量選擇(全選、反選、全不選)

    這篇文章主要介紹了Android編程中ListView結(jié)合CheckBox實(shí)現(xiàn)批量選擇,包括實(shí)現(xiàn)全選、反選、全不選等操作,感興趣的小伙伴們可以參考一下
    2016-01-01
  • 不可不知的Android strings.xml那些事

    不可不知的Android strings.xml那些事

    相信 strings.xml 已經(jīng)是大家在 Android 開(kāi)發(fā)中最熟悉的文件之一了,但其實(shí)它也有很多需要注意的地方和一些小技巧,知道了這些可以讓你的 Android 應(yīng)用更加規(guī)范易用,大家來(lái)看看吧
    2016-08-08
  • Android采取ContentObserver方式自動(dòng)獲取驗(yàn)證碼

    Android采取ContentObserver方式自動(dòng)獲取驗(yàn)證碼

    這篇文章主要為大家詳細(xì)介紹了Android采取ContentObserver方式自動(dòng)獲取驗(yàn)證碼,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Android移動(dòng)應(yīng)用開(kāi)發(fā)指南之六種布局詳解

    Android移動(dòng)應(yīng)用開(kāi)發(fā)指南之六種布局詳解

    Android應(yīng)用界面要美觀(guān)好看,就需要運(yùn)用到一定的布局技術(shù),Android布局是不可忽視的,是android應(yīng)用界面開(kāi)發(fā)的重要一環(huán),這篇文章主要給大家介紹了關(guān)于Android移動(dòng)應(yīng)用開(kāi)發(fā)指南之六種布局的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • Android自定義控件之水平圓點(diǎn)加載進(jìn)度條

    Android自定義控件之水平圓點(diǎn)加載進(jìn)度條

    這篇文章主要為大家詳細(xì)介紹了Android自定義控件之水平圓點(diǎn)加載進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • Android Jetpack組件之ViewModel使用詳解

    Android Jetpack組件之ViewModel使用詳解

    Android中的ViewModel是一個(gè)可以用來(lái)存儲(chǔ)UI相關(guān)的數(shù)據(jù)的類(lèi)。ViewModel的生命周期會(huì)比創(chuàng)建它的Activity、Fragment的生命周期長(zhǎng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2023-04-04

最新評(píng)論