標籤:
夏至 歡迎轉載,也請保留這段申明,謝謝
最近太忙了,都沒什麼時間來整理,前9個上傳之後格式不對,都沒好好整理,以後會抽空整理。
Android的通訊橋樑 —— Intent 。
使用一個activity實在是太簡單了,布局上也有限,那我們能不能像我們真機上的一樣,一點就跳到另一個介面去了。這裡我們就使用Intent,在活動中穿梭。至於為什麼學著UI組件,突然跑到這個傢伙來,那當然是為下一節做準備啦。除了活動,它還可以是服務或者廣播。啟動可以下列方法:
- startActivity(Intent)/startActivityForResult(Intent):來啟動一個Activity
- startService(Intent)/bindService(Intent):來啟動一個Service
- sendBroadcast:發送廣播到指定BroadcastReceiver
這裡,我們就簡單地用 Activity 來當例子,畢竟用得最多的就是活動了。
顯式Intent與隱式Intent的區別
顯式Intent:
通過組件名指定啟動的目標組件,比如startActivity(new
Intent(A.this,B.class));每次啟動的組件只有一個。
隱式Intent:
不指定組件名,而指定Intent的Action,Data,或Category,當我們啟動 組件時,會去匹配AndroidManifest.xml相關組件的Intent-filter,逐一匹配出滿足屬性的組件, 當不止一個滿足時, 會彈出一個讓我們選擇啟動哪個的對話方塊
1.1 顯示Intent
首先,我們先建立一個布局,就叫做sec_linearlayout好了:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/btnBack" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="按鍵測試"/></LinearLayout>然後,我們再建立一個新activity,名字可以自己取,比如我的取為SencondActivity,讓它繼承Activity:```javapublic class SecondActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sec_linearlayout); }}<div class="se-preview-section-delimiter"></div>
最後,我們在AndroidManifest.xml,把我們新定義的activity包含進去。這裡因為不是主activity。所以只要一行就可以了。如下:
接下來就是在主Activity寫程式了,由上面的 Intent(A.this,B.class))和startActivity(Intent)就可以了:
setContentView(R.layout.linearlayout);Button button = (Button)findViewById(R.id.btnInter);button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this,SecondActivity.class); startActivity(intent); }});<div class="se-preview-section-delimiter"></div>
1.2 隱式Intent
傳遞資料給下一個活動
我們先來看一下AndroidManifest.xml檔案中標籤
其中畫圈圈的地方,就是我們隱式Intent最主要的東西了。
- aciotn : 表示當前可以相應的活動,有且只有一個。
- category:表示包含的一些附加資訊,和相互配合,可以多個。
可以試試這個效果,先體驗一下:
這裡我們假設一下,比如我們就讓第二個activity瀏覽我們手機預設瀏覽器,並跳到百度。在事件開發中,我們不可能因為一個事件,而又重新去開發一個瀏覽器,這不實現,所以,我們可以調用系統的。修改如下:
<activityandroid:name=".SecondActivity"> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter></activity><div class="se-preview-section-delimiter"></div>
效果
關於隱式Intent我們就先瞭解到這,先簡單瞭解就行,後面我們再來深入研究。
1.3 多個活動之間傳遞資料
在啟動活動時傳遞資料的思路其實很簡單,Intent中提供了一系列 putExtra(string name,value)方法的重載,可以把我們想要傳遞的資料暫存在Intent中,啟動了另一個活動後,只需要把這些資料再從Intent中取出就可以了,接收可以用:getStringExtra(string name
putExtra(string name,value):name為上下文索引值,第二個為要傳遞的資料,支援多種類型
所以,主activity這樣寫:
button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this,SecondActivity.class); intent.putExtra("data","hello world"); startActivity(intent);}<div class="se-preview-section-delimiter"></div>
第二個活動這樣寫
這樣,我們就完成了想下一個活動傳遞的功能了,當然了,不一定是字串,可以是內容,檔案資料等其他。
裡我們使用了字串,所以用getSringExtra()來接收,如果是整型,則用 getIntExtra(),如果是boolean 型,則用 getBooleanExtra(),以此類推。
返回資料給上一個活動
既然可以傳資料給下一個活動,那麼肯定能傳遞資料給上一個活動了。不過這裡我們不再用startActivity(),而是用startActivityForResult()來啟動活動。該方法接收兩個參數,第一個還是Intent ,第二個是請求碼。直接看代碼:主activity:
button.setOnClickListener(new View.OnClickListener() {@Override public void onClick(View v) { // Intent(A.this,B.class)); Intent intent = new Intent(MainActivity.this,SecondActivity.class); startActivityForResult(intent,1); }});
由於我們使用startActivityForResult()來啟動SecondActivity的,在SecondActivity被銷毀之後會回調上一個活動的onActivityResult()方法,因為我們需要在MainActivity中重寫這個方法來擷取資料。
這樣,當第二個活動被銷毀的時候,就能返回資料到onActivityResult()來,我們就能獲資料了。
Intent 就暫時怎麼多了,深入我們在進階在來講解。
不得不吐槽一下CSDN的圖片粘貼的問題,每次都上傳真心蛋疼,有誰支個招嗎。。。。
Android 學習筆記(10)—— Intent 基本運用