Android核心技术-Activity与Intent

本文讲述两点
一、Activity
二、Intent


Activity

在Android中,Activity提供了与用户交互的可视化界面。
在一个Android应用中可以有多个Activity,这些Activity组成了Activity栈(Stack),当前活动的Activity位于栈顶,之前的Activity被压入下面成为非活动Activity,等待是否可能被恢复为活动状态,4个重要状态如下.
在这里插入图片描述

Activity生命周期的回调方法

在这里插入图片描述

如何设置Activity

(1)创建Activity,一般继承android.app的Activity类,也可以继承它的之类,如下,创建一个名称为"MyActivity"的Activity

import android.app.Activity;
public class MyActivity extends Activity{
    
}

(2)重写回调方法,并且在该方法调用setContentView()方法显示界面,在(1)中创建的Activity中,重写onCreate()方法,并设置显示的页面为activity_my.xml

public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_me);
    }

(3)配置Activity
一个Activity对应一个< activity></ activity>
配置方法是在AndroidManifest.xml 的< application></ application>标记中添加< activity></ activity>标记实现,< activity>标记格式如下.

<activity
android:name="实现类名"
android:lable="说明性文字"
android:theme="要应用的主题"
>
</activity>

配置信息如下

	<activity android:name=".MyActivity" android:label="详细"></activity>

(4)启动Activity
在一个Android中,当有多个Activity时,需要应用startActivity()方法启动需要的Activity,该方法没有返回值,只有一个intent的入口参数,Intent是Android应用各组件之间的通信方式,指定要被启动的Activity

public void startActivity(Intent intent)

如要启动类名称为"MyActivity"的Activity

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

(5)关闭Activity
可以使用Activity类提供的finish()方法,该方法较简单,例如,在单机按钮时关闭Activity,可以使用如下的代码

Button button1 = (Button)findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener(){
	public void onClick(View v){
		finish();
	}
});



多个Activity的使用

当在一个Activity启动另一个Activity时,经常需要传递一些数据。这时就可以通过Intent来实现,因为Intent通常被称为两个Activity之间的信使。在Android中可以将要保存的数据放在Bundle对象中,然后通过Intent提供的putExtras()方法将要携带的数据保存在Intent中
在这里插入图片描述
说明:Bundle是一个key-value组合,用于保存要携带的数据包,数据类型可以是基本的类型或对应数组,也可以是对象,如果是对象或对象数组时,必须实现Serializable或者Parcelable接口.

以下按上面所述的Activity知识模拟一个简单登陆界面

MainActivity

public class MainActivity extends AppCompatActivity  {
   private Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button=(Button) findViewById(R.id.btn);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //为按钮添加单击监听事件.
                String username = ((EditText) findViewById(R.id.edit1)).getText().toString();
                String phonenum = ((EditText) findViewById(R.id.edit2)).getText().toString();
                if (!username.equals("")&&!phonenum.equals("")){
                    //将输入的信息保存到Bundle中,通过Intent传递到另一个Activity中显示出来
                    Intent intent = new Intent(MainActivity.this, AddressActivity.class);
                    Bundle bundle = new Bundle();
                    bundle.putCharSequence("username",username);
                    bundle.putCharSequence("phonenum",phonenum);
                    intent.putExtras(bundle);    //将bundle对象添加到Intent对象中
                    startActivity(intent);  //启动Activity
                }else{
                    Toast.makeText(MainActivity.this,"请把信息填完整!",Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
}

activity_main.xml
使用相对布局


	<EditText
        android:id="@+id/edit1"
        android:text="姓名"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <EditText
        android:id="@+id/edit2"
        android:text="电话"
        android:layout_below="@id/edit1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/btn"
        android:onClick="Test"
        android:layout_below="@id/edit2"
        android:layout_alignRight="@id/edit2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="登陆"/>

AddressActivity(自己创建的一个Activity名为AddressActivity)


	public class AddressActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_address);
        Intent intent = getIntent();    //获取Intent对象
        Bundle bundle = intent.getExtras(); //获取传递的Bundle对象.
        TextView username = (TextView) findViewById(R.id.username); //获取username的TextView对象
        username.setText(bundle.getString("username")); //获取输入的姓名并显示到username
        TextView phonenum = (TextView) findViewById(R.id.phonenum);
        phonenum.setText(bundle.getString("phonenum"));
    }
}

activity_address.xml
使用相对布局


	<TextView
        android:id="@+id/username"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <TextView
        android:id="@+id/phonenum"
        android:layout_below="@id/username"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

运行效果如图:
在这里插入图片描述
在这里插入图片描述




调用另一个Activity并返回结果

有时需要在一个Activity中调用另一个Activity,当调用结束后,自动返回第一个Activity
此功能可以通过Intent和Bundle来实现,与在两个Activity之间交换数据不同的是,此处需要使用startActivityForResult()方法来启动另一个Activity。调用startActivityForResult()方法启动Activity后,关闭新启动的Activity,将选择结果返回原Activity中。

public void startActivityForResult(Intent intent,int requestCode)



Intent

Intent中文意思是"意图"。它是Android程序中传输数据的核心对象,在Android官方文档中,对Intent的定义是执行某操作的一个抽象描述。它可以开启新的Activity,也可以发送广播消息,或者开启Service服务。

3种基本应用:

  • 开启Activity
    通过将一个Intent对象传递给startActivity()方法,可以启动一个新的Activity,并且可以携带一些必要的数据。另外,可以将Intent对象传递给startActivityForResult()方法中,这样,在获取返回结果时,可以在调用它的Activity的onActivityResult()方法中接收返回结果。
  • 开启Service
    通过将一个Intent对象传递给startActivity()方法,启动一个Service来完成一次操作(如下载文件)
  • 传递Broadcase(广播)

显示创建Intent

如上述所讲就是现实创建的Intent

Intent intent = new Intent(Context packageContext,Class<?>cls)
startActivity(intent);
//intent 对象名称,packageContext用于指定启动Activity上下文对象,可以使用Activity名.this(如MainActivity.this)指定
//cls:用于指定启动Activity所在的类,使用Activity名.class形式

隐式创建Intent

指在创建Intent对象时不指定具体的接收者,而是定义要执行的Action、Category和Data,然后让Android系统根据相应匹配机制找到要启动的Activity。
如在自己的应用程序中展示一个网页,调用系统浏览器打开.

Intent intent = new Intent(Intent.ACION_VIEW,Uri.parse("http://www.baidu.com"));
startActivity(intent);

Intent过滤器

使用Intent启动Activity时,并没有在Intent中指明Activity所在的类。因此,Android系统根据相应匹配机制找到要启动的Activity,这种机制就是由Intent过滤器实现。
说明:Intent过滤器是一种根据Intent中的Action、Data和Category属性对适合接收该Intent的组件进行匹配筛选。
在AndroidManifest.xml文件的各个声明标记中,使用< Intent-fest>标记声明该组件所支持的动作、数据和种类等信息。
< action>标签用于指定组件所能相应的动作,以字符串形式表现.
< data>标记用于向Action提供要操作的数据。
< category>标记用于指定以何种方式去执行Intent请求的动作。

<intent-filter>
	<action android:name="android.intent.action.VIEW"/>
	<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>

模拟图片放大查看:源码后续将上传至github

以上仅为个人学习笔记,如有知识性错误,请批评指正.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值