Activity关于Intent的组件应用与小例子

Activity组件应用

一、Activity的生命周期与启动模式

五种状态

  1. 启动状态(OnCreate):当 Activity启动之后便会进入下一状态。
  2. 运行状态(OnStart):Activity处于屏幕最前端,可与用户进行交互
  3. 暂停状态(OnPause):Activity仍然可见,但无法获取焦点,用户对它操作没有响应
  4. 停止状态(OnStop):Activity完全不可见,系统内存不足时会销毁该Activity
  5. 销毁状态(OnDestroy):Activity将被清理出内存

栈是一种“先进后出”的数据结构。Android中,采用任务栈的形式来管理 Activity。

四种启动模式

  1. standard模式:是Activity的默认启动方式,每启动一个 Activity就会在栈顶创建一个新的实例。
  2. singleTop模式:判断要启动的 Activity实例是否位于栈顶,如果位于栈顶则直接复用,否则创建新的实例。
  3. singleTask模式:每次启动该 Activity时,系统首先会检查栈中是否存在当前 Activity实例,如果存在则直接使用,并把当前Activity之上的所有实例全部出栈。
  4. singlelnstance模式:启动一个新的任务栈来管理 Activity实例,无论从哪个任务栈中启动该 Activity,该实例在整个系统中只有一个。

二、Intent(意图)

Intent被称为意图,是程序中各组件进行交互的一种重要方式,它不仅可以指定当前组件要执行的动作,还可以在不同组件之间进行数据传递。

一般用于启动 Activity、Service以及发送广播等。根据开启目标组件的方式不同,Intent被分为两种类型显示意图隐式意图

  1. 显式意图可以直接通过名称开启指定的目标组件
Intent intent=new Intent(this,Activity02.class);
intent.putExtra("extra_data","Hello Activity02");//Intent提供的putExtra()方法进行数据传递
startActiviy(intent);
Intent intent=getIntent();
String data=intent.getStringExtra("extra_data");//接收数据
  1. 隐式意图通过指定 action和 category等属性,系统根据这些信息进行分析后寻找自标 Activity
Intent intent=new Intent();
intent.setAction("cn.iteast.START_ACTIVITY");
startActivity(intent);
<activity android:name="cn.iteast.Activity02">
	<intent-filter>
		<action android:name="cn.iteast.START_ACTIVITY"/>
		<category android:name="android.intent.category.DEFALT"/>
	</intent-filter>
</activity>

显式意图和隐式意图不同的地方就在于显式意图直接打开Activity的界面,这往往是单一的;而隐式意图是通过action等属性打开界面,如果有多个相同action的界面,就会显示多个,例如你想要打开一个文件,系统就会弹出用WPS打开、用记事本打开等等,这就是一种隐式意图吧。

数据回传

Intent intent=new Intent(this,Activity02.class);
startActivityForResult(intent,1);//这里不能使用startActivity
Intent intent=new Intent();
intent.putExtra("extra_data","Hello Activity01");
setResult(1,intent);//回传数据
protected void onActivityResult(int requestCode,int resultCode,Intent data){
	super.onActivityResult(requestCode,resultCode,data);
		if(requestCode==1){
			if(resultCode==1){
				String string=data.getStringExtra("extra_data");
				}
			}
}

小例子

一、菜单栏

1.实现效果
在这里插入图片描述

2.代码实现
第一种方法:在xml文件里写菜单栏
新建一个menu.xml文件在里面写入以下代码

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/main_menu_0"
        android:icon="@drawable/pic0"
        android:title=" 打印 "
        app:showAsAction="withText"
        />
    <item android:id="@+id/main_menu_1"
        android:icon="@drawable/pic1"
        android:title=" 新建 "
        />
    <item android:id="@+id/main_menu_2"
        android:icon="@drawable/pic2"
        android:title=" 邮件 "
        />
    <item android:id="@+id/main_menu_3"
        android:icon="@drawable/pic3"
        android:title=" 设置 "
        />
    <item android:id="@+id/main_menu_4"
        android:icon="@drawable/pic4"
        android:title=" 订阅 "
        />
</menu>

在java主文件中写入以下代码

package com.example.androidapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.TextView;

public class Menuexample extends AppCompatActivity {
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        MenuInflater menuInflater=getMenuInflater();
        menuInflater.inflate(R.menu.menu_ex,menu);
        return true;
    }
    public boolean onOptionsItemSelected(MenuItem item) {
        TextView label = (TextView)findViewById(R.id.label);
        switch (item.getItemId()) {
            case R.id.main_menu_0:
                label.setText(" 打印,菜单 ID:" + item.getItemId());
                return true;
            case R.id.main_menu_1:
                label.setText(" 新建,菜单 ID:" + item.getItemId());
                return true;
            case R.id.main_menu_2:
                label.setText(" 邮件,菜单 ID:" + item.getItemId());
                return true;
            case R.id.main_menu_3:
                label.setText(" 设置,菜单 ID:" + item.getItemId());
                return true;
            case R.id.main_menu_4:
                label.setText(" 订阅,菜单 ID:" + item.getItemId());
                return true;
            default:
                return false;
        }
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_menuexample);
    }
}

除了连接layout布局的xml文件外,还要写一个函数连接菜单栏的xml文件,TextView文件写在layout布局的xml文件内。在switch语句中,每个case里的名字应该是菜单栏xml文件里给各个选项定义的名字。

第二个方法:逻辑代码动态生成菜单
在java主文件里写入以下代码

package com.example.androidapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.TextView;

public class Menuexample extends AppCompatActivity {
    final static int MENU_00 = Menu.FIRST;
    final static int MENU_01 = Menu.FIRST+1;
    final static int MENU_02 = Menu.FIRST+2;
    final static int MENU_03 = Menu.FIRST+3;
    final static int MENU_04 = Menu.FIRST+4;
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.add(0,MENU_00,0," 打印 ").setIcon(R.drawable.pic0);
        menu.add(0,MENU_01,1," 新建 ").setIcon(R.drawable.pic1);
        menu.add(0,MENU_02,2," 邮件 ").setIcon(R.drawable.pic2);
        menu.add(0,MENU_03,3," 设置 ").setIcon(R.drawable.pic3);
        menu.add(0,MENU_04,4," 订阅 ").setIcon(R.drawable.pic4);
        return true;
    }
    public boolean onOptionsItemSelected(MenuItem item) {
        TextView label = (TextView)findViewById(R.id.label);
        switch (item.getItemId()) {
            case MENU_00:
                label.setText(" 打印,菜单 ID:" + item.getItemId());
                return true;
            case MENU_01:
                label.setText(" 新建,菜单 ID:" + item.getItemId());
                return true;
            case MENU_02:
                label.setText(" 邮件,菜单 ID:" + item.getItemId());
                return true;
            case MENU_03:
                label.setText(" 设置,菜单 ID:" + item.getItemId());
                return true;
            case MENU_04:
                label.setText(" 订阅,菜单 ID:" + item.getItemId());
                return true;
            default:
                return false;
        }
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_menuexample);
    }
}

跟第一个方法的区别在于不用写xml文件,而是动态生成菜单栏。
这里通过add方法添加选项和图片。你会发现这两种方法都没显示出我们要的图标,因为这里需要设置图标可见,可以在第一种方法的xml文件中,给每个item加上
app:showAsAction=“ifRoom|withText”(标题栏有空的地方就加上图标)
或app:showAsAction=“always|withText”(通常显示图标),效果如下
在这里插入图片描述

二、Intent信息回传

1.效果展示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
二、代码实现
这个例子中需要三个activity
主activity的代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <TextView
        android:id="@+id/textShow"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text=""
        />
    <Button
        android:id="@+id/btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=" 启动 Activity1"
        />
    <Button
        android:id="@+id/btn2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=" 启动 Activity2"
        />
</LinearLayout>

第一个子activity的代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <TextView
        android:id="@+id/textShow"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="SubActivity 1"
        />
    <EditText
        android:id="@+id/edit"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text=""
        />
    <Button
        android:id="@+id/btn_ok"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:text=" 接受 "
        />
    <Button
        android:id="@+id/btn_cancel"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:text=" 撤销 "
        />
    />
</LinearLayout>

第二个子activity的代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <TextView
        android:id="@+id/textShow"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="SubActivity 2"
        />
    <Button
        android:id="@+id/btn_return"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:text=" 关闭 "
        />
    />
</LinearLayout>

主java文件代码:

package com.example.intentexample;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class mainActivity extends AppCompatActivity {
    private static final int SUBACTIVITY1=1;
    private static final int SUBACTIVITY2=2;
    TextView textView;

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

        textView=(TextView)findViewById(R.id.textShow);
        final Button btn1=(Button)findViewById(R.id.btn1);
        final Button btn2=(Button)findViewById(R.id.btn2);

        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(mainActivity.this,subactivity1.class);
                startActivityForResult(intent,SUBACTIVITY1);
            }
        });

        btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(mainActivity.this,subactivity2.class);
                startActivityForResult(intent,SUBACTIVITY2);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data){
        super.onActivityResult(requestCode,resultCode,data);

        switch(requestCode){
            case SUBACTIVITY1:
                if(resultCode==RESULT_OK){
                    Uri uriData=data.getData();
                    textView.setText(uriData.toString());
                }
                break;
            case SUBACTIVITY2:
                break;
        }
    }


}

第一个子java文件:

package com.example.intentexample;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;

import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class subactivity1 extends AppCompatActivity {

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

        final EditText editText=(EditText) findViewById(R.id.edit);
        Button btnOK=(Button) findViewById(R.id.btn_ok);
        Button btnCancel=(Button)findViewById(R.id.btn_cancel);

        btnOK.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String uriString=editText.getText().toString();
                Uri data= Uri.parse(uriString);

                Intent result=new Intent(null,data);

                setResult(RESULT_OK,result);
                finish();
            }
        });

        btnCancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                setResult(RESULT_CANCELED,null);
                finish();
            }
        });
    }

}

第二个子java文件:

package com.example.intentexample;

import android.os.Bundle;

import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

import android.view.View;
import android.widget.Button;

public class subactivity2 extends AppCompatActivity {

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

        Button btnReturn=(Button) findViewById(R.id.btn_return);

        btnReturn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                setResult(RESULT_CANCELED,null);
                finish();
            }
        });
    }

}

这个例子利用了Intent进行信息回传,主要代码是

        Intent result=new Intent(null,data);
        setResult(RESULT_OK,result);//把结果码,数据传出去
		Intent intent=new Intent(this,subactivity1.class);//打开subacitity1的界面
		startActivityForResult(intent,SUBACTIVITY1);//SUBACTIVITY1是给这个界面设置的请求码,目的是可以辨认出是哪个activity界面回传的信息
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data){//请求码,结果码,数据
        super.onActivityResult(requestCode,resultCode,data);

        switch(requestCode){//请求码用来获得是哪个activity回传的信息
            case SUBACTIVITY1:
                if(resultCode==RESULT_OK){//判断结果类型
                    Uri uriData=data.getData();//对结果进行解码
                    textView.setText(uriData.toString());
                }
                break;
            case SUBACTIVITY2:
                break;
        }
    }
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值