Android开发之Activity

活动(Activity)

活动是最容易吸引用户的地方,它是一种可以包含用户界面的组件,主要用于和用户交互。

FirstActivity

手动创建活动

新建一个project,不再选择empty activity,选择add no activity,手动创建活动

1550441-20190121162138932-1065161789.jpg

此时app/src/java/com.example.activity为空,右击新建empty activity,不要勾选generate layout filelauncher activity

1550441-20190121162202554-1175870742.jpg

注:

勾选generate layout file表示自动为activity创建一个对应的布局文件

勾选launcher activity表示自动将activity设置为当前项目的主活动

勾选backwards compatibility表示为项目启用向下兼容的模式

手动创建和加载布局

右击app/src/main/res目录,新建directory,在此目录下新建layout resource file,在布局中添加一个button,在活动中加载布局

setContentView(R.layout.布局文件名称)
AndroidManifest文件中注册并为程序配置主活动
<activity android:name=".FirstActivity"
            android:label="This is FirstActivity">   //指定活动中标题栏的内容
            //配置主活动
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

        </activity>

注册声明要放在<application>标签内,通过<activity>标签来对活动进行注册

运行结果

1550441-20190121162222716-1943561159.jpg

在活动中使用Toast

toastandroid系统提供的一种非常好的提醒方式在程序中可以使用它将一些短小的信息通知给用户。

protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);
        Button button1 = (Button) findViewById(R.id.button_1);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(FirstActivity.this, "You clicked Button 1", Toast.LENGTH_SHORT).show();
            }
        });
    }

定义弹出toast的触发点,以button为例:findViewById()方法获取到在布局文件中定义的元素,此方法返回的是一个View对象,通过向下转型将它转成button对象
Toast通过静态方法makeText()创建出一个Toast对象,然后调用show()Toast显示出来。

1550441-20190121162234000-312180454.jpg

在活动中使用Menu

res目录下新建menu文件夹,在menu文件夹中新建menu resource file,添加如下代码,<item>标签用来创建具体的某一个菜单项

<item
        android:id="@+id/add_item"
        android:title="Add"/>
    <item
        android:id="@+id/remove_item"
        android:title="Remove"/>

定义菜单响应事件:

(1)菜单布局完成后,回到activity中重写onCreateOptionsMenu()方法,(快捷键ctrl+O),添加如下代码

public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main,menu);
        return true;
    }

通过getMenuInflater()方法得到MenuInflater对象,再调用它的inflate()方法就可以给当前活动创建菜单了

(2)添加菜单响应事件

public boolean onOptionsItemSelected(MenuItem item){
        switch (item.getItemId()){
            case R.id.add_item:
                Toast.makeText(this,"you clicked Add",Toast.LENGTH_SHORT).show();
                break;
            case R.id.remove_item:
                Toast.makeText(this,"You clicked Remove",Toast.LENGTH_SHORT).show();
                break;
            default:
        }
        return true;
    }

在onOptionsItemSelected()方法中,通过调用item.getItemId()来判断点击的菜单项,然后给每个菜单项添加逻辑处理

销毁一个活动

(1)点击返回键即可

(2)通过代码实现

button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });

完整代码:

// FirstActivity
package com.example.mark.activitytest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class FirstActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);
        Button button1 = (Button) findViewById(R.id.button_1);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(FirstActivity.this, "You clicked Button 1", Toast.LENGTH_SHORT).show();
            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main,menu);
        return true;
    }

    public boolean onOptionsItemSelected(MenuItem item){
        switch (item.getItemId()){
            case R.id.add_item:
                Toast.makeText(this,"you clicked Add",Toast.LENGTH_SHORT).show();
                break;
            case R.id.remove_item:
                Toast.makeText(this,"You clicked Remove",Toast.LENGTH_SHORT).show();
                break;
            default:
        }
        return true;
    }
}

SecondActivity

右击app/src/java/com.example.activity新建SecondActivity,勾选generate layout file,但不要勾选launcher activity

1550441-20190121162257245-732851797.jpg

此时SecondActivity和对应的布局文件已经生成,修改布局文件,添加一个button

<?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/button_2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button2"/>

</LinearLayout>

任何一个活动都需要在AndroidManifest文件中注册,由于SecondActivity不是主活动,因此不需要配置<intent-filter>标签里的内容

intent

(1)显式intent

修改FirstActivityonClick()方法

button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
                startActivity(intent);
            }
        });

首先构建出一个Intent,传入FirstActivity.this作为上下文,传入SecondActivity.class作为目标活动,即在FirstActivity这个活动的基础上打开SecondActivity这个活动,然后通过startActivity()方法来执行这个intent,执行结果如下

1550441-20190121162307459-1193043734.jpg

(2)隐式intent

通过在<activity>标签下配置<intent-filter>的内容,可以指定当前活动能够响应的actioncategory,修改AndroidManifest如下

<activity android:name=".SecondActivity">
            <intent-filter>
                <action android:name="com.example.mark.activitytest.ACTION_START" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>>
        </activity>

<action>标签指明了当前活动可以响应com.example.mark.activitytest.ACTION_START这个action,而<category>标签则包含了一些附加信息,更精确地指明了当前活动能够响应的intent中还可能带有的category。只有<action><category>中的内容同时能够匹配上intent中指定的<action><category>时,这个活动才能响应该intent

修改FirstActivityonClick()方法

button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("com.example.mark.activitytest.ACTION_START");
                startActivity(intent);
            }
        });

此时使用intent的另一个构造函数,直接将action的字符串传了进去,表明我们想要启动能够响应com.example.mark.activitytest.ACTION_START这个action的活动。执行结果如下

6.jpg

每个intent中只能指定一个action,但却能指定多个category

调用intentaddCategory()方法添加一个category

button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("com.example.mark.activitytest.ACTION_START");
                intent.addCategory("com.example.mark.activitytest.MY_CATEGORY");
                startActivity(intent);
            }
        });

AndroidManifest文件在<intent-filter>中添加category声明

<activity android:name=".SecondActivity">
            <intent-filter>
                <action android:name="com.example.mark.activitytest.ACTION_START" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="com.example.mark.activitytest.MY_CATEGORY" />
            </intent-filter>
        </activity>

(3)更多隐式intent用法

使用隐式intent,不仅可以启动自己程序内的活动,还可以启动其他程序内的活动,使得Android多个应用程序之间的功能共享成为了可能

AndroidManifest文件添加内容如下

<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>

调用系统浏览器打开网页,修改FirstActivityonClick()方法

button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setData(Uri.parse("http://cn.bing.com"));
                startActivity(intent);
            }
        });

首先指定了intentactionIntent.ACTION_VIEW,这是Android系统内置的动作,然后通过Uri.parse()方法,将一个网址字符解析成一个Uri对象,再调用intent的setData()方法将这个Uri对象传递进去。执行结果如下

1550441-20190121162325952-1715003911.jpg

ThirdActivity

创建ThirdActivity,保持文件内容不变,布局文件如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">


    <Button
        android:id="@+id/button_3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button3" />
</LinearLayout>

AndroidManifest文件修改ThirdActivity注册信息如下

<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>

<intent-filter>中配置了当前活动能够响应的actionintentACTION_VIEW的常量值,而category则毫无疑问指定了默认的category值,另外在<data>标签中我们通过android:scheme指定了数据的协议必须是http协议,这样ThirdActivity应该就和浏览器一样,能够响应一个打开网页的intent了。

更多隐式intent用法

  • android:scheme 用于指定数据的协议部分,如:http。
  • android:host 用于指定数据的主机名部分,如:www.baidu.com。
  • android:port 用于指定数据的端口部分,一般紧随在主机名之后。
  • android:path 用于指定主机名和端口之后的部分。
  • android:mimeType 用于指定可以处理的数据类型,允许使用通配符的方式进行指定。
调用系统拨号界面
button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_DIAL);
                intent.setData(Uri.parse("tel:10086"));
                startActivity(intent);
            }
        });

首先指定了intentactionIntent.ACTION_DIAL,这是Android系统的内置动作。然后在data部分指定了协议是tel,号码是10086。执行结果如下

1550441-20190121162341778-1196468254.jpg

注:

只有<data>标签中指定的内容和intent中携带的data完全一致时,当前活动才能够响应该intent

向下一活动传递数据(FirstActivity传递字符串到SecondActivity)

FirstActivity文件如下

button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String data = "hello SecondActivity";
                Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
                intent.putExtra("extra_data",data);
                startActivity(intent);
            }
        });

使用显式intent的方式启动SecondActivity,并通过putExtra()方法传递了一个字符串。putExtra()方法接收两个参数,第一个参数是键,用于后面从intent中取值,第二个参数才是真正要传递的数据。

然后在SecondActivity中将传递到数据取出,并打印出来。

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        Intent intent = getIntent();
        String data = intent.getStringExtra("extra_data");
        Log.d("SecondActivity",data);

    }
}

首先通过getIntent()方法获取到用于启动SecondActivityintent,然后调用getStringExtra()方法,传入相应的键值,就可以得到传递的数据了。运行后,点击按钮,查看logcat打印信息如下

1550441-20190121162358523-411980009.jpg

返回数据给上一活动

修改FirstActivity中按钮的点击事件如下

button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
                startActivityForResult(intent,1);
            }
        });

startActivityForResult()方法用于启动活动,此方法期望在活动销毁的时候能够返回一个结果给上一个活动。startActivityForResult()接收两个参数,第一个参数是intent,第二个参数是请求码,用于在之后的回调中判断数据的来源。

SecondActivity中给按钮注册点击事件

button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.putExtra("data_return","hello firstactivity");
                setResult(RESULT_OK,intent);
                finish();
            }
        });

setResult()方法接收两个参数,第一个参数用于向上一个活动返回处理结果,第二个参数把带有数据的intent传递回去,然后调用了finish()方法来销毁当前活动

由于使用startActivityForResult()方法启动SecondActivity,在SecondActivity被销毁之后会回调上一个活动的onActivityResult()方法,所以需要在FirstActivity中重写这个方法得到返回的数据。如下

@Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        switch (requestCode){
            case 1:
                if (resultCode == RESULT_OK){
                    String returnedData = data.getStringExtra("data_return");
                    Log.d("FirstActivity",returnedData);
                }
                break;
            default:
        }
    }

运行程序,查看logcat的打印信息如下:

1550441-20190121162410355-617682124.jpg

通过返回键传递数据

SecondActivty中重写OnBackPressed()

@Override
    public void onBackPressed() {
        Intent intent = new Intent();
        intent.putExtra("data_return","hello FirstActivity");
        setResult(RESULT_OK,intent);
        finish();
    }
活动的生命周期

onRestart()之外,其他互相对应。

完整生存期:onCreate()onDestroy()

可见生存期:onStart()onStop()

前台生存期:onResume()onPause()

活动的启动模式
  1. standard

  2. singleTop

  3. singleTask

  4. singleInstance

AndroidManifest.xml中通过给android:launchMode属性来选择启动模式

转载于:https://www.cnblogs.com/mark-zh/p/10299428.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值