1. 程式人生 > 其它 >Android四大元件——Activity——Activity之間通訊上

Android四大元件——Activity——Activity之間通訊上

Activity之間的跳轉有顯式意圖和隱式意圖兩種。

顯式意圖(顯式Intent):

 

//建立一個Intent物件,明確Intent跳轉時的源Activity和目標Activity。引數一為當前Activity物件,引數二表示要啟動的目標Activity.
Intent intent = new Intent(MainActivity.this,MainActivity2.class);
//啟動目標元件,根據intent啟動目標Activity startActivity(intent);

 

 

 

1.定義兩個Activity:MainActivity和MainActivity2

 

 2.佈局檔案:在activity_main.xml中

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation
="vertical" tools:context=".MainActivity"> <TextView android:layout_margin="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="賬號" /> <EditText android:id="@+id/username" android:layout_margin
="10dp" android:layout_width="match_parent" android:layout_height="wrap_content"/> <TextView android:layout_margin="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="密碼"/> <EditText android:id="@+id/userpassword" android:layout_margin="10dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textPassword"/> <Button android:id="@+id/singin" android:layout_margin="10dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="登陸"/> </LinearLayout>

 

 效果圖為:

 

 activity_main2.xml如下:

<?xml version="1.0" encoding="utf-8"?>
<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=".MainActivity2">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="登陸成功!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

效果圖:

 

 

跳轉:點選activity_main.xml中的登陸按鈕就跳轉到activity_main2.xml

3.功能實現: 

package com.kotlin.activitystudy;

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {
    private EditText username,userpassword;
    private Button singin;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        //設定singin的點選事件
        singin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this,MainActivity2.class);
                startActivity(intent);
            }
        });
    }
    private void initView(){ //控制元件繫結
        username = findViewById(R.id.username);
        userpassword = findViewById(R.id.userpassword);
        singin = findViewById(R.id.singin);
    }
}

這樣我們就完成了MainActivity到ManActivity2的顯式跳轉

當然在跳轉的同時,我們還可以在Activity之間傳遞資料。顯式Intent資料傳遞方法:

向下一個頁面傳遞資料:

putExtra(String name,String value) //第一個引數是鍵,第二個引數是要傳遞的值

putExtra(String name,int value)  //傳遞整型資料

putExtra(String name,boolean value)  //傳遞布林型別資料

putExtra(String name,Serializable value) //傳遞序列化物件

下一個頁面接收資料:

getStringExtra(String name) //接受鍵值為name的字串資料

getIntExtra(String name,int defaultvalue)  

getBooleanExtra(String name,boolean defaultvalue)  //傳遞布林型別資料

getSerializableExtra(String name) //接收序列化物件

 

修改MainActivity和MainActivity2中的程式碼,使得跳轉後,顯示使用者資訊。

修改MainActivity:只需在startActivity(intent);之前加上傳遞資料的程式碼

@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,MainActivity2.class);
intent.putExtra("username",username.getText().toString());
intent.putExtra("userpassword",userpassword.getText().toString());
startActivity(intent);
}

修改MainActivity2:

package com.kotlin.activitystudy;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.TextView;

public class MainActivity2 extends AppCompatActivity {
    private TextView information;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        initView();
        //接受傳遞過來的資料
        String username = getIntent().getStringExtra("username");//鍵值不能寫錯
        String userpassword = getIntent().getStringExtra("userpassword");
        //接受的資料顯示出來
        information.setText(username+"你好"+"您的密碼為"+userpassword+"歡迎登陸");
    }
    private void initView(){
        information = findViewById(R.id.information);
    }
}

執行效果:

 

這樣我們就完成了簡單的資料傳遞。

當然我們也可以加一些小功能,如對是否輸入賬號密碼進行判斷

修改MainActivity:

package com.kotlin.activitystudy;

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    private EditText username,userpassword;
    private Button singin;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        //設定singin的點選事件
        singin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this,MainActivity2.class);
                Boolean flag = handlerLogin();
                if (flag) {
                    intent.putExtra("username", username.getText().toString());
                    intent.putExtra("userpassword", userpassword.getText().toString());
                    startActivity(intent);
                }
            }
        });
    }

    private Boolean handlerLogin(){
        String nameText = username.getText().toString().trim();//trim()是去掉空格
        if (TextUtils.isEmpty(nameText)){
            Toast.makeText(this,"輸入的賬號為空",Toast.LENGTH_SHORT).show();
            return false;
        }
        String passwordText = userpassword.getText().toString().trim();
        if (TextUtils.isEmpty(passwordText)) {
            Toast.makeText(this,"輸入的密碼為空",Toast.LENGTH_SHORT).show();
            return false;
        }
        return true;
    }

    private void initView(){ //控制元件繫結
        username = findViewById(R.id.username);
        userpassword = findViewById(R.id.userpassword);
        singin = findViewById(R.id.singin);
    }
}

 執行效果:

 

 

 這樣就實現了Activity的跳轉,我們還可以為跳轉加上動畫效果。

android自帶了很多動畫效果,這裡我們演示系統自帶的淡入淡出動畫。

修改MainActivity程式碼:只需在startActivity(intent);後加上跳轉動畫效果

intent.putExtra("username", username.getText().toString());
intent.putExtra("userpassword", userpassword.getText().toString());
startActivity(intent);
overridePendingTransition(android.R.anim.fade_in,android.R.anim.fade_out);

在進入MainActivity時便有淡入的效果。

從MainActivity進入MainActivity2時呼叫:

startActivity(intent); overridePendingTransition(android.R.anim.fade_in,android.R.anim.fade_out);

MainActivity2進入MainActivity時呼叫:
overridePendingTransition(android.R.anim.fade_in,android.R.anim.fade_out)

修改MainActivity2的程式碼:

 

    @Override
    protected void onPause() {
        super.onPause();
        overridePendingTransition(android.R.anim.fade_in,android.R.anim.fade_out);
    }

 

只需重寫該方法。這裡涉及到activity的生命週期,就不詳細講了。

修改完後便可以用於淡入淡出的動畫效果了。

 

隱式意圖(隱式Intent)

不會指定特定的元件,而是宣告要執行的常規操作,從而允許其他應用中的元件來處理它。例如,如需要在地圖上向用戶顯示位置,則可以用隱式Intent,請求另一具有此功能的應用在地圖上顯示指定位置。

建立隱式Intent時,Android系統通過將Intent的內容與在裝置上其他應用的清單檔案中宣告的Intent過濾器進行比較,從而找到要啟動的相應元件,如果Intent與Intent過濾器匹配,則系統將啟動該元件,並向其傳遞Intent物件。如果多個Intent過濾器相容,則系統會顯示一個對話方塊,支援使用者選取要使用的應用。

Intent過濾器是應用清單檔案中的一個表示式,它指定該元件要接收的Intent型別。例如,通過為Activity宣告Intent過濾器,可以使其他應用能夠直接使用某一特定型別的Intnet啟動Activity。同樣,如果您沒有為Activity宣告任何Intent過濾器,則Activity只能通過顯示Intent啟動。

1.建立新的Activity,為MainActivity3

2.在應用清單檔案中加入:

<activity android:name=".MainActivity3">
    <intent-filter>
       <action android:name="com.kotlin.activitystudy.LOGIN_INFO"/> <!--指明當前Activity可以響應com.kotlin.LOGIN_INFO這個action -->
       <category android:name="android.intent.category.DEFAULT"/>  <!--預設類別。 -->
    </intent-filter>
</activity>

 只有<action>和<category>中的內容同時匹配Intent中指定的action和category時,這個Activity才能響應該Intent。

3.修改MainActivity中的程式碼:

package com.kotlin.activitystudy;

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    private EditText username,userpassword;
    private Button singin;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        //設定singin的點選事件
        singin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("com.kotlin.activitystudy.LOGIN_INFO");
                Boolean flag = handlerLogin();
                if (true) {
                    intent.putExtra("username", username.getText().toString());
                    intent.putExtra("userpassword", userpassword.getText().toString());
                    startActivity(intent);
                    overridePendingTransition(android.R.anim.fade_in,android.R.anim.fade_out);
                }
            }
        });
    }

    private Boolean handlerLogin(){
        String nameText = username.getText().toString().trim();//trim()是去掉空格
        if (TextUtils.isEmpty(nameText)){
            Toast.makeText(this,"輸入的賬號為空",Toast.LENGTH_SHORT).show();
            return false;
        }
        String passwordText = userpassword.getText().toString().trim();
        if (TextUtils.isEmpty(passwordText)) {
            Toast.makeText(this,"輸入的密碼為空",Toast.LENGTH_SHORT).show();
            return false;
        }
        return true;
    }

    private void initView(){ //控制元件繫結
        username = findViewById(R.id.username);
        userpassword = findViewById(R.id.userpassword);
        singin = findViewById(R.id.singin);
    }
}

只修改了一句程式碼

Intent intent = new Intent("com.kotlin.activitystudy.LOGIN_INFO");

點選登陸按鈕,發現MianActivity3啟動成功。

這裡使用的是Intent另一個建構函式,直接將action的字串傳了進去,表明我們想要啟動能夠響應com.kotlin.activitystudy.LOGIN_INFO這個action的Activity。而在AndroidManifest.xml中,已經為MianActivity3設定了action為com.kotlin.activitystudy.LOGIN_INFO。所以此處成功啟動MianActivity3。

注意:清單檔案中的<category android:name="android.intent.category.DEFAULT"/>是一種預設的category,在呼叫StartActivity方法的時候會自動將這個category新增到Intent中。

每個Intent中只能指定一個action,但能指定多個category。

修改清單檔案:

 

<activity android:name=".MainActivity3">
   <intent-filter>
      <action android:name="com.kotlin.activitystudy.LOGIN_INFO"/> <!--指明當前Activity可以響應com.kotlin.LOGIN_INFO這個action -->
      <category android:name="android.intent.category.DEFAULT"/>  <!--預設類別。 -->
      <category android:name="com.kotlin.activitystudy.MY_CATEGORY"/>
   </intent-filter>
</activity>

 

我們添加了一個category,所以在MainActivity中也要新增該category才能成功啟動MainActivity3

 

修改MainActivity:

Intent intent = new Intent("com.kotlin.activitystudy.LOGIN_INFO");
intent.addCategory("com.kotlin.activitystudy.MY_CATEGORY");
           

新增後,就可以隱式的啟動MainActivity3了