前言
學習 Activity、Intent、Context文章來源:http://www.zghlxwxcb.cn/news/detail-623455.html
一、Activity
1、繼承關(guān)系
java.lang.Object
? android.content.Context
? android.content.ContextWrapper
? android.view.ContextThemeWrapper
? android.app.Activity
- Activity繼承自ContextThemeWrapper,可以設(shè)置主題。
- ContextThemeWrapper繼承自ContextWrapper,封裝了Context的常用功能。
- ContextWrapper繼承自Context,即Activity本質(zhì)上是一個Context。
- Context定義了與Android環(huán)境交互的接口。
- 最終都繼承自java.lang.Object。
- 通過這種繼承,Activity就集成了Context的能力,可以訪問資源、數(shù)據(jù)庫、SharedPreferences等。
同時作為Context的子類,Activity也可以作為Context參數(shù)被傳遞使用。
這種繼承關(guān)系讓Activity既是一個 UI 組件,也是一個Context,很好地結(jié)合了兩者的功能
2、簡介
-
Activity
代表應用程序的單個屏幕,用戶可以使用該屏幕執(zhí)行單一、集中的任務,Activity 通常以全屏窗口的形式呈現(xiàn)給用戶; - Activity 是一個應用程序組件,單個用戶任務的單個屏幕;
- 每個 Activity 都有自己的布局文件;
- 可以為 Activity 分配父子關(guān)系,以在應用程序中啟用向上導航;
- 一個應用程序通常由多個彼此松散的屏幕組成。每個屏幕都是一個 Activity;
- 應用程序中有一個
主Activity
(MainActivity.java),在應用程序啟動時呈現(xiàn)給用戶;通過主Activity
可以啟動其他 Activity 來執(zhí)行不同的操作; - 每次啟動新活動,前一個 Activity 都會停止,但系統(tǒng)會將該 Activity 保留在堆棧中;當新 Activity 啟動時,該新 Activity 被推入后臺堆棧并獲取用戶焦點;當用戶完成當前 Activity 并按下后退按鈕時,該 Activity 將從堆棧中彈出并銷毀,并恢復上一個 Activity;
- Activity 是有意圖地開始或激活的。
Intent
是一條異步消息,可以在 Activity 中使用它來請求來自另一個 Activity 或某個其他應用程序組件的操作;可以使用 Intent 從一個 Activity 啟動另一個 Activity,并在 Activity 之前傳遞數(shù)據(jù);
二、Intent
- 允許從應用程序中的另一個組件請求操作。例如,從另一個組件啟動一個 Activity;
- 顯示 Intent:可以指示接收數(shù)據(jù)的特定目標組件;
- Intent 附加信息是 Bundle,鍵值對;
三、Context
- 全局信息:應用程序的資源,圖片資源、字符串資源 ;
- 作用:用來訪問全局信息,一些常用的組件(Activity、Service)繼承自 Context(繼承后具有訪問全局資源的能力),目的是通過 Context 方便地訪問資源;
- setText 的實現(xiàn):
getContext()
:獲取相關(guān)的 Context 對象,getResource()
:獲取資源管理器,getText(id)
:返回資源 id 的字符串;// 訪問字符串資源 public class MainActivity extends AppCompatActivity { private TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); tv = new TextView(this); // this:MainActivity的實例,將this傳給context,在內(nèi)部對context有一個引用 tv.setText(R.string.hello_world); setContentView(tv); // 指定一個視圖 } }
// 訪問圖片資源 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ImageView iv = new ImageView(this); iv.setImageResource(R.mipmap.ic_launcher); } }
四、實踐 Lab
1、需求
- 創(chuàng)建并構(gòu)建兩個 Activity(
Activity1
和Activity2
); -
Activity1
作為主 Activity,主要包含一個 “發(fā)送” 按鈕,當用戶點擊此按鈕將使用Intent
來啟動Activity2
;

- 主 Activity 中添加 EditText,用戶輸入消息,并點擊發(fā)送按鈕,主 Activity 使用 Intent 來啟動第二個 Activity 并將用戶的消息發(fā)送到第二個 Activity,第二個 Activity 顯示它接收到的消息

- 第二個 Activity 添加 EditText 和回復按鈕;用戶鍵入回復消息并點擊回復按鈕,使用 Intent 將回復消息從第二個 Activity 傳遞給主 Activity,并顯示;

2、代碼實現(xiàn)
- 創(chuàng)建第一個Activity 布局
// activity_main.xml(主Activity)
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/button_main"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_marginRight="16dp"
android:textColor="@android:color/background_dark"
android:layout_marginBottom="16dp"
android:onClick="launchSecondActivity"
android:text="@string/button_main" />
<EditText
android:id="@+id/editText_main"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"
android:layout_marginStart="32dp"
android:layout_marginLeft="32dp"
android:layout_marginBottom="19dp"
android:ems="10"
android:inputType="text"
android:text="Name" />
</RelativeLayout>
- 創(chuàng)建第二個Activity 布局
// 第二個Activity
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".SecondActivity">
<TextView
android:id="@+id/text_header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="16dp"
android:text="@string/text_header"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/text_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="60dp"
android:layout_marginTop="40dp"
android:text=""
android:textAppearance="AppCompat.Medium"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/text_header" />
</androidx.constraintlayout.widget.ConstraintLayout>
- 主 Activity 添加 Intent
public void launchSecondActivity(View view) {
// 將顯示Intent添加到主Activity,Intent用于單擊發(fā)送按鈕時激活第二個Activity
// 參數(shù):第一個參數(shù),應用程序Context;第二個參數(shù):將接收該Intent的特定組件
// 當點擊發(fā)送按鈕時,MainActivity發(fā)送Intent并啟動第二個Activity 出現(xiàn)在屏幕
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
}
}
- 從主 Activity 發(fā)送數(shù)據(jù)到第二個 Activity
- 使用 Intent 將數(shù)據(jù)從一個 Activity 發(fā)送到另一個 Activity
- Intent 傳遞數(shù)據(jù)到目標 Activity 的方式
- 1)數(shù)據(jù)字段:Intent 數(shù)據(jù)指要操作的特定數(shù)據(jù)的 URl
- 2)Intent 附加信息,如果傳遞的數(shù)據(jù)不是 URl 或想要發(fā)送多條信息,可以將附加信息放入
extras
中。 - Intent 附加信息內(nèi)容是
Bundle
。Bundle 是數(shù)據(jù)集合,存儲形式為鍵值對; - 從一個 Activity 傳遞信息到另一個 Activity,可以將鍵和值放入發(fā)送 Activity 的 Intent extra 中,然后在接收 Activity 中將它們?nèi)〕觯?/li>
Bundle 中包含其他數(shù)據(jù),本需求中為用戶輸入的字符串文章來源地址http://www.zghlxwxcb.cn/news/detail-623455.html
public class MainActivity extends AppCompatActivity {
private static final String LOG_TAG = MainActivity.class.getSimpleName();
public static final String EXTRA_MESSAGE = "com.example.myapplication.extra.MESSAGE";
private EditText mMessageEditText;
public static final int TEXT_REQUEST = 1; // 第二個Activity回復響應的鍵
private TextView mReplyHeadTextView; // 回復標頭Textview
private TextView mReplyTextView; // 回復TextView元素
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // 指定一個視圖
mMessageEditText = findViewById(R.id.editText_main); // 使用findViewById()獲取對 EditText 的引用
mReplyHeadTextView = findViewById(R.id.text_header_reply);
mReplyTextView = findViewById(R.id.text_message_reply);
}
public void launchSecondActivity(View view) {
// 將顯示Intent添加到主Activity,Intent用于單擊發(fā)送按鈕時激活第二個Activity
// 參數(shù)1:應用程序Context和將接收該Intent的特定組件
// 當點擊發(fā)送按鈕時,MainActivity發(fā)送Intent并啟動第二個Activity 出現(xiàn)在屏幕
Intent intent = new Intent(this, SecondActivity.class);
String message = mMessageEditText.getText().toString();
intent.putExtra(EXTRA_MESSAGE, message);
startActivityForResult(intent, TEXT_REQUEST);
}
@Override
// 回調(diào)方法
// requestCode:請求
public void onActivityResult(int requestCode, int resultCode, Intent data) {
// 處理返回數(shù)據(jù)
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == TEXT_REQUEST) {
if (requestCode == RESULT_OK) {
String reply =
data.getStringExtra(SecondActivity.EXTRA_REPLY);
mReplyHeadTextView.setVisibility(View.VISIBLE);
mReplyTextView.setText(reply);
mReplyTextView.setVisibility(View.VISIBLE);
}
}
}
}
- 將數(shù)據(jù)從第二個 Activity 返回給主 Activity
startActivity():使用顯式 Intent 啟動另一個 Activity 時,不會期望返回任何數(shù)據(jù),只是激活該 Activity;
如果想從激活的 Activity 中獲取數(shù)據(jù),則需要以 startActivityForResult() 啟動它
public class SecondActivity extends AppCompatActivity {
public static final String EXTRA_REPLY = "com.example.myapplication.extra.REPLY";
private EditText mReply;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
mReply = findViewById(R.id.editText_second);
// 獲取激活此Activit的Intent
Intent intent = getIntent();
// 獲取Intent extra中包含的字符串
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
// 獲取要顯示的控件的引用
TextView textView = findViewById(R.id.text_message);
// 通過引用在此控件上顯示獲取Intent extra中包含的字符串
textView.setText(message);
}
public void returnReply(View view) {
String reply = mReply.getText().toString();
Intent replyIntent = new Intent();
replyIntent.putExtra(EXTRA_REPLY, reply);
setResult(RESULT_OK, replyIntent);
finish();
}
}
到了這里,關(guān)于04 |「Activity 和 Intent」的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!