文章目錄
- 剛接觸android的一些易忘易忽略操作
- 一、在活動中創建選單
- 1、在res/menu下創建main.xml檔案(打開冰箱)
- 2、撰寫選單布局檔案(放入大象)
- 3、在activity中重寫onCreateOptionsMenu()和onOptionsItemSelected(MenuItem item)方法(關上冰箱)
- 二、使用顯示和隱式的Intent(穿梭于活動間)
- 0、準備
- 1、最簡單的使用方法-使用顯示Intent
- 2、隱晦的使用方法-使用隱式Intent
- (1)通常的隱式用法
- (2)更隱式的用法
- (3)更多\標簽可配置內容
- 3、用Intent傳遞資料
- (1)活動一發送
- (2)活動二接受
- (3)回傳資料給上一個活動
剛接觸android的一些易忘易忽略操作
? 持續更新,,,最近更新于:2021-07-27
最近重溫了一下android基礎,打算自己開發一個android的會議軟體,以此篇博客來記錄這一開始,一起和我重溫一下android吧,
這是一篇非零基礎android學習的博客,而是一篇android小白的查缺補漏的一篇android的細節補充
此篇文章主要對于一些常規或復雜操作(不常用容易忘記)的記錄
就如將大象放進冰箱里一樣(將冰箱打開、大象放進冰箱,關上冰箱),下面介紹的一些個人認為有必要記錄一下的操作也會像將大象放進冰箱里一樣簡單
🎉 工具:android studio
🎲 主要基于android7.0或有其他補充
一、在活動中創建選單
這是本篇文章的第一個操作,原生的選單可能在開發中不常用,但也可謂是一個知識點呢,看看是如何在一個活動中創建一個選單的吧,
我盡力將所有步驟簡化為放進三步,像冷藏大象一樣:
1、在res/menu下創建main.xml檔案(打開冰箱)
首先在res目錄下新建一個名為menu的目錄,再在menu目錄下新建一個名為main的Menu resource file,
2、撰寫選單布局檔案(放入大象)
在我們新建的main.xml中添加如下代碼
<menu xmln:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/add_item"
android:title="Add"/>
<item
android:id="@+id/remove_item"
android:title="Remove"/>
</menu>
這里在布局中創建了一個選單,選單里有Add和Remove兩個item
3、在activity中重寫onCreateOptionsMenu()和onOptionsItemSelected(MenuItem item)方法(關上冰箱)
首先回到我們的主activity中,在activity中重寫onCreateOptionsMenu()方法,將menu注冊到acitivity上,
public boolean onCreateOptionsMenu(Menu menu){
getMenuInflater().inflate(R.menu.main,menu);
return true;
}
getMenuInflater().inflate(R.menu.main,menu);傳入了兩個引數第一個引數當然是我們事先編輯好的選單布局xml檔案,第二個引數是用于指定我們的選單項將添加到那個Menu物件中去,這里我們就直接使用重寫方法中的menu引數
回傳true表示允許選單顯示,false則表示無法顯示
這是我們將我們自定義的menu布局注冊到了activity中的menu物件里,如果我們想要監聽每一個選單項被選擇時發生的動作,我們還需要重寫onOptionsItemSelected(MenuItem item)方法,
public boolean onOptionsItemSelected(MenuItem item){
switch(item.getItemId()){
case R.id.add_item:
Toast.makeTest(this,"you clicked add",Toast.LENGTH_SHORT).show();
break;
case R.id.remove_item:
Toast.makeTest(this,"you clicked remove",Toast.LENGTH_SHORT).show();
break;
}
return true;
}
可以看到下面的運行內容:

看,我們很容易通過三步在活動中創建了一個選單,
二、使用顯示和隱式的Intent(穿梭于活動間)
為啥還要提一下Intent呢,這不是一個最常用的一個東西嘛,但就因為常用并且是拿著一種Intent的使用方法從頭用到尾,以至于Intent的其他使用方法就拋在腦后了,
這一節我們就來說說Intent的顯示和隱式的幾種方法用于活動中:
服務、廣播的場景后面陸續補充,以及用Intent傳遞資料
0、準備
首先準備兩個普通的活動,第一個活動配置了默認啟動的活動
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
第二個活動就是一個普通的活動
<activity android:name=".SecondActivity"></activity>
1、最簡單的使用方法-使用顯示Intent
如何使用Intent使得應用從FirstActivity跳轉到SecondActivity,這里我們就在FirstActivity中放置一個按鈕并且為按鈕系結一個點擊事件,使得點擊這個按鈕就能夠跳轉到第二個活動里,代碼如下所示:
button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
//下面代碼為顯式Intent使用方法
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
}
});
首先我們創建一個Intent,并選用構造方法為傳入第一個活動FirstActivity.this為背景關系,傳入SecondActivity.class為目標活動作為跳轉地址,這樣的Intent的意圖就非常顯然了,即從第一個活動為基礎打開第二個活動,所以稱之為顯示Intent,
2、隱晦的使用方法-使用隱式Intent
(1)通常的隱式用法
這里我們的條件和第一種Intent使用的前提一樣都有兩個活動,并在第一個活動中添加一個按鈕用于跳轉到第二個活動,但不同的是,此處咱需要讓Intent這個意圖收斂一點不能讓別人一下就能看穿我們的想法,要做一個有小心思的Intent,
這里就需要在AndroidManifest.xml中去配置要跳轉到的活動,給他添加包含自定義的action和category兩個標簽,用于標識這個活動可以回應帶有指定action和category的Intent,活動二的AndroidManifest如下所示:
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.example.action.ACTION_START_TEST" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.example.category.CATEGORY_TEST" />
</intent-filter>
</activity>
自定義的activity用于標識SecondActivity可由含有action值為
com.example.action.ACTION_START_TEST的Intent啟動而自定義的category不是必須的,但他的作用和自定義action相同,可以使得定位條件更加的精細
此時啟動SecondActivity的Intent代碼應該如下:
button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
//下面代碼為隱式Intent使用方法
Intent intent = new Intent("com.example.action.ACTION_START_TEST"); //指定action
intent.addCategory("com.example.category.CATEGORY_TEST"); //指定categoty
startActivity(intent);
}
});
就如上面的代碼所表達的,滿足了指定的action和category的Intent就能開啟第二個活動,
這里使用的Intent的構造方法是傳入一個String型別的action用于指定一個action的名稱
addCategory()方法用來添加一個category
(2)更隱式的用法
對于Intent的簡單的隱式使用方法我們已經知道了,但是如果我們想啟動別的程式或者系統自帶的程式該怎么做呢,我們接下來通過一個需求和案例來了解一下更隱式且更好用的方式是什么樣的,它可以用于一個程式呼叫另外一個程式的某一功能,
**需求:**假如我們自己撰寫的一個程式需要打開一個網頁,這時我們不必自己內置一個瀏覽器,就可以呼叫系統的瀏覽器來打開一個網頁:
在第一個活動中添加按鈕并系結事件,實作如下:
button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
//下面代碼為更隱式Intent使用方法
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
}
});
首先我們就如上小節說的那樣創建一個指定action為Intent.ACTIOIN_VIEW的Intent,這時android內置的一個action,其常量值為
android.intent.action.VIEW,并且使用intent設定了一個資料:setData()方法傳入一個Uri物件用于匹配Data符合的intent
這樣我們就可以打開手機的瀏覽器并打開傳入的網站了,
如果我們想讓我們自己的程式也可以作為一個打開鏈接的選項,這要如何實作呢
其他代碼不變的情況下,這里我們創建第三個活動,并為這個活動設定一個可以action用于標識該活動可以被指定action的Intent啟動,我們這里是為了使我們的程式可以在點開連接后與瀏覽器有相同的選擇地位,這里的action與系統瀏覽器指定的action名稱一致,并且設定了一個<data>標簽,改標簽中指定的內容和Intent中攜帶的完全一致時,活動才會回應Intent:
<activity android:name=".ThirdActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http" />
</intent-filter>
</activity>
這樣就實作了一個通過data呼叫其他應用的intent的小demo,這里我們不僅了解了如何使用Intent呼叫系統應用,還學習了如何讓自己的應用也可以和系統應用公平競爭用戶選擇權,
對于不同的Intent.ACTION_*與data的組合,還可以呼叫其他系統應用,例如手機短信、手機電話等
下面是一個呼出手機電話的例子:
button.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v){ //下面代碼為呼叫電話的方式 Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:120")); startActivity(intent); } });
呼叫電話的Uri是
tel:120,不同的程式的uri不同,請根據需要進行查詢和使用,
(3)更多<data>標簽可配置內容
| <data>可配置項 | 描述 |
|---|---|
| android:scheme | 用于指定資料的協議部分 如:http |
| android:host | 用于指定資料的主機名部分 如:www.baidu.com |
| android:port | 用于指定資料的埠部分 如:8080 |
| android:path | 用于指定主機名和埠之后的部分 如:/list/findAll |
| android:mimeTpe | 用于指定可以處理的資料型別 |
3、用Intent傳遞資料
那么,我們甚至學會了做一個像系統應用一樣可以提供給別的程式呼叫的應用,那別人是怎么將資料傳到我們應用的,我們的應用又是怎么接受的呢,原來Intent不僅可以用于啟動活動,還可以在啟動活動時傳遞資料,
我們就看一下是怎么操作的吧,
我們就接著上面的SecondActivity那個例子繼續來,我們的SecondActivity已經可以通過接受http協議的Data來回應Intent了,但卻沒有做任何事情(但什么都沒有發生),我們就分別的修改一下活動一和活動二的代碼:
(1)活動一發送
button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
//下面代碼為活動一種用于發送資料的事件
String data = "hello second activity"; //用于發送給活動二的資料
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
intent.putExtra("extra_data",data);
startActivity(intent);
}
});
上面的代碼,除了之前我們用于隱式跳轉到活動二的代碼外,我們還要使用
putExtra()來進行資料的傳遞,putExtra()方法接受兩個引數,第一個引數是一個key,第二個引數就是要傳遞的資料value
(2)活動二接受
重寫onCreate方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_layout);//設定布局
Intent intent = getIntent(); //獲得開啟該活動的Intent
String data = intent.getStringExtar("extra_data"); //根據key獲得傳入的資料
Log.d("extra_data:",data);
}
通過
getIntent()方法獲得啟動SecondActivity的Intent,然后呼叫getStringExtra()獲得鍵對應的資料值,并列印,
(3)回傳資料給上一個活動
上面兩個步驟就可以完成了活動之間資料的傳遞,但是要是想要一個在第二個活動回傳到第一個活動時候給第一個活動一個執行結果該怎么做呢,我們再介紹一種用于回傳給上一個活動資料的使用方式:
一個活動想要獲得跳轉至的活動頁回傳的資料可以使用
startActivityForResult()方法
startActivityForResult()方法接受兩個引數,一個是用于傳遞的intent,第二個是請求碼,用于在獲得回傳資料的回呼函式中用于判斷資料的來源,
還是——在第一個活動中創建一個按鈕并系結事件,使用startActivityForResult()來進行啟動活動二:
button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivityForResult(intent,1);
}
});
這里使用
startActivityForResult()方法來開啟活動,只需要保證第二個請求碼唯一即可
現在我們要在第二個活動中進行回傳結果,這里重寫onBackPressed()方法:當點擊回傳鍵時觸發
@Override
public void onBackPressed(){
Intent intent = new Intent();
Intent.putExtra("data_return","I am return data");
setResult(RESULT_OK,intent); //回傳結果
finish();
}
這里依然使用了Intent用于傳遞資料,RESULT_OK和RESULT_CANCEL是內置的值
finish()用于銷毀當前的活動
再回到我們第活動一中,重寫回呼方法onActivityResult()
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
switch(requestCode){ //根據剛開始傳入到startActivityForResult()第二個引數的requestCode判斷是否是該活動想要得到的結果
case 1:
if(resultCode==RESULT_OK){
String returnedDataa = data.getStringExtra("data_return");
Log.d("returnedData:",returnedData);
}
break;
default:
}
}
以上幾個步驟就完成了資料的傳遞和結果的回傳
簡要流程:FirstActivity→
startActivityForResult→SecondActivity→setResult→FirstActivity→onActivityResult
📘 參考書籍:《第一行代碼 android》第二版
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/290399.html
標籤:其他
