Android 的 Activity (四)

一、关于 Activity 的介绍

Activity 代表应用程序中的单个屏幕,其中包含用户可以与之交互的界面。应用程序中的 Activity 相互协作形成良好的用户体验,每个 Activity 都是独立于其他的 Activity。例如,我们在发消息时可以启动相机的一个 Activity 来实现拍照,或者在邮箱中启动一个 Activity 来分享照片。

通常情况下,Activity 应用程序中都会有一个被指定为 "主要" 的活动,就比如我们的第一个Android 应用程序中的 MainActivity。用户在第一次启动app时,会看到 MainActivity,每个 Activity 都可以启动不同的 Activity 来执行不的操作。

每当一个新的 Activity 开始执行时,前一个活动就会停止,此时,系统会将 Activity 保存在堆栈中,当用户按下后退键时,该 Activity 就会被堆栈弹出并销毁,并恢复先前的 Activity。

了解完 Activity 之后,我们去学习一下如何创建一个 Activity?

二、创建一个 Activity

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

我们创建好新的项目后并选择 向后兼容性 (AppCompat) 选项后,MainActivity类 默认情况下会继承 AppCompatActivity类。该类的作用是允许我们使用最新的 Android 应用程序功能,可以使我们的应用程序能够与运行旧版本 Android 的设备兼容。

我们的应用程序必须实现一个回调方法 oncreate( ),系统在创建我们的 Activity 时会调用 oncreate( ) 方法,我们 Activity 中所有重要的组件都应该在此初始化。还有一点,更重要的是,oncreate( ) 方法会调用 setContentView( ) 方法来创建 layout 为我们的 Activity。

我们通常会定义 UI 在一个或者多个 XML 文件中为了 Activity,当 setContentView( ) 方法被 layout文件调用时,系统会从指定的 layout 中创建所有的初始化 view,并将这些 view 添加到我们的 Activity 中。简称:膨胀布局~

三、在 AndroidManifest.xml 中声明 Activity

<activity android:name=".MainActivity">
     <intent-filter>
          <action android:name="android.intent.action.MAIN" />

          <category android:name="android.intent.category.LAUNCHER" />
     </intent-filter>
</activity>

我们应用程序中的每个 Activity 都应该在 AndroidManifest.xml 文件中声明,这里我们声明了 MainActivity这个类。<activity> ... </activity> 这个标签里不仅仅可以有 android:name,也可以有android:label、android:icon、android:enabled 等属性。

这里我们浅谈一下这里面的 <intent-filter> ... </inter-fliter> 标签

<intent-fliter> 指定我们的 Activity 能够接受 Intent 的类型,<intent-fliter> 标签中必须包含至少一个 <action> 元素,也可以包含 <category> 和 <data> 元素。我们的 MainActivity 应用程序需要一个 <intent-filter> 来定义一个 "主要" 动作 和 "启动器"类别,这样系统才能够启动我们的 app。在我们的项目中,Android Studio 创建这个 <intent-filter> 为了我们的 MainActivity 应用程序中。

<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />

<action>元素 用来指定这是应用程序的主要入口点,<category>元素 用来指定这个 Activity 应该被列在系统的应用程序启动其中,为的是允许用户启动这个 Activity。

每个 Activity 都可以定义 <intent-filter>,但是应当只有我们的 MainActivity类 中才会有"主要" 动作!

四、关于 Intent 的介绍

每一个 Activity 中都会激活或者启动一个 Intent,Intent是一个消息对象。在 Android 运行时,它向Android 发出请求,去启动或者激活其他组件或者应用程序。

当我们从 Home 启动 MainActivity 时,运行时的 Android 会发送 Intent 到我们的 app 来启动我们的 "主要" 动作(也就是所谓的主程序 ),如果我们想在自己得应用程序中去启动另一个 Activity,我们就需要构建自己的 Intent,并调用 startActivity( ) 来发送 Intent。当然,Intent 除了启动另一个 Activity 之外,还可以在 Activity 之间进行数据传递

Intent 的分类

        ① 显式 Intent:我们使用指定的 Activity 的完全限定名来去指定 接收的 Activity 或者其他的 component

以显式 Intent 来启动 Activity,Activity 要从一个特定的 Activity 开始,跳转到特定的 Activity 或者 component ( 完全限定名 )。使用 startActivity( ) 方法,Intent 对象作为唯一的参数startActivity( ) 方法发送 Intent 到 Android 系统,Android 系统启动 MyDataTextView.class 来代表我们的 app。我们要知道,当新的 Activity 出现在屏幕式,老的 Activity 就会停止活动。如果我们想关闭当前的 Activity 并被系统回收,则需要调用 finish( ) 方法~

intent = new Intent(this, MyDataTextView.class);
startActivity(intent);

        ② 隐式 Intent:我们不需要使用指定的 Activity 或者 其他的 component 来接收 Intent。我们只需要声明操作即可,Android 系统会将我们的请求与可以处理所请求操作的 Activity 或其他的 component 相匹配。

intent = new Intent();
intent.setAction(Intent.ACTION_DIAL);
startActivity(intent);

显示 Intent 和 隐式 Intent 的区别是什么?

显示 Intent 用于在一个应用中启动不同的 Activity,而隐式 Intent 用于启动不同应用中的 Activity。

Intent 如何在 Activity 间携带数据信息进行传递?

使用 putExtra( ) 方法来在 Activity 之间传递数据信息,使用的是 键值对 的形式添加到 Intent 中。

intent.putExtra("userName", "张三");
intent.putExtra("age", "18");

接收已启动的Activity 传递的 Intent, 需要使用 getIntent( ) 方法

Intent intent = getIntent();

获得 Intent 对象变量后,使用对应的类型方法接收数据( 这里我们是 String 类型的数据 )

String userName = intent.getStringExtra("userName");
String age = intent.getStringExtra("age");

五、测试代码

Java文件

1)MainActivity类

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        init();
    }

    private void init(){
        Button btn1 = findViewById(R.id.btn1);
        Button btn2 = findViewById(R.id.btn2);
        Button btn3 = findViewById(R.id.btn3);

        btn1.setOnClickListener(this);
        btn2.setOnClickListener(this);
        btn3.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Intent intent;
        switch (v.getId()){
            case R.id.btn1:
                intent = new Intent(this, MyDataTextView.class);
                intent.putExtra("userName", "张三");
                intent.putExtra("age", "18");
                startActivity(intent);
                break;
            case R.id.btn2:
                intent = new Intent(this, BaiduView.class);
                intent.putExtra("website", "www.baidu.com");
                startActivity(intent);
                break;
            case R.id.btn3:
                intent = new Intent();
                intent.setAction(Intent.ACTION_DIAL);
                startActivity(intent);
                break;
            default:
                System.out.println("null...");
        }
    }
}

2)MyDataTextView类

public class MyDataTextView extends AppCompatActivity {
    private TextView view1;
    private TextView view2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_data_text_view);
        view1 = findViewById(R.id.tx1);
        view2 = findViewById(R.id.tx2);

        doActionBar();
        getData();
    }

    private void doActionBar() {
        ActionBar actionBar = getSupportActionBar();
        Objects.requireNonNull(actionBar).setTitle("Click me!");
        actionBar.setDisplayHomeAsUpEnabled(true);
    }

    private void getData() {
        Intent intent = getIntent();
        String userName = intent.getStringExtra("userName");
        String age = intent.getStringExtra("age");
        view1.setText(userName);
        view2.setText(age);
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                this.finish();
                return true;
            default:
                System.out.println("null...");
        }
        return super.onOptionsItemSelected(item);
    }
}

3)BaiduView类

public class MyDataTextView extends AppCompatActivity {
    private TextView view1;
    private TextView view2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_data_text_view);
        view1 = findViewById(R.id.tx1);
        view2 = findViewById(R.id.tx2);

        doActionBar();
        getData();
    }

    private void doActionBar() {
        ActionBar actionBar = getSupportActionBar();
        Objects.requireNonNull(actionBar).setTitle("Click me!");
        actionBar.setDisplayHomeAsUpEnabled(true);
    }

    private void getData() {
        Intent intent = getIntent();
        String userName = intent.getStringExtra("userName");
        String age = intent.getStringExtra("age");
        view1.setText(userName);
        view2.setText(age);
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                this.finish();
                return true;
            default:
                System.out.println("null...");
        }
        return super.onOptionsItemSelected(item);
    }
}

XML文件

1)activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Click me!" />

    <Button
        android:id="@+id/btn2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Go to Baidu"/>

    <Button
        android:id="@+id/btn3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Call Someone"/>

</LinearLayout>

2)activity_my_data_text_view.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tx1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <TextView
        android:id="@+id/tx2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

3)activity_baidu_view.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/bd"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="cn.com.myfirstactivity">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.MyFirstActivity">
        <activity android:name=".MyDataTextView"/>
        <activity android:name=".BaiduView" />
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

运行结果

MainActivity

MyDataTextView 

 

BaiduView 

 

 隐式 Intent 调用不同应用的 Activity

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值