Android-Activity(一)启动活动

什么是Activity

Activity是一种包含用户界面的应用程序组件,主要用于和用户进行交互。

Activity基本用法

创建一个Activity

app -> java -> package -> FirstActivity

public class FirstActivity extends AppCompatActivity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
	}
}

创建和加载布局

创建布局

Android程序设计讲究逻辑和视图分离,最好每个活动都能对应一个布局。
创建一个布局文件:res -> layout -> first_layout.xml
这里选择LinearLayout作为根元素:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical"
	android:layout_width="match_parent"
	android:layout_height="match_parent">

LinearLayout>

添加一个按钮:

<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_1"
		android:layout_width="match_parent"
		android:layout_height="wrap_content"
		android:text="Button_1"
	/>
LinearLayout>

android:id="@+id/button_1" 设定该button的id为button_1
android:layout_width="match_parent" 设定当前元素的宽度,match_parent表示和父元素一样宽
android:layout_height="wrap_content"设定当前元素的高度,wrap_content表示高度只要能刚好包含里面的内容就行
android:text:设定元素显示的文字内容

加载布局

调用setContentView方法来给当前的活动加载一个布局,在该方法中传入一个布局文件的id(项目中任何添加的资源文件都会在R文件中生成一个相应的资源id,调用R.layout.first_layout即可得到first_layout.xml布局文件的id)

public class FirstActivity extends AppCompatActivity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.first_layout);
	}
}

在AndroidManifest文件中注册

注册活动

所有的的活动都要在Androidmanifest.xml中注册才能生效
activity的注册声明要放在标签内,通过标签来进行注册.
标签内,android:name 来指定具体注册哪一个活动。.FirstActivity表示com.example.activitytest.FirstActivity的缩写,因为application的package属性已经指明了程序的包名。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	package="com.example.activitytest">
	<application
		......
		......>
		<activity android:name=".FirstActivity">activity>
	application>
mainfest>

为程序配置主活动

标签内加入标签,并且在该标签内添加如下两句声明

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

还可以通过android:label指定活动栏中标题的内容,标题栏是显示在活动最顶部的

修改后的xml文件如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	package="com.example.activitytest">
	<application
		......
		......>
		<activity android:name=".FirstActivity"
			android:label="This is FirstActivity">
			<intent-fliter>
				<action android:name="android.intent.action.MAIN"/>
				<category android:name="android.intent.category.LAUNCHER"/>
			<intent-fliter>
		activity>
	application>
mainfest>

完成以上步骤后,FirstActivity就是程序的主活动了,即点击桌面应用程序图标时首先打开的就是这个活动。(如果一个程序没有声明任何一个activity作为主活动,该程序依旧可以安装,但是无法在启动器中看到或者打开这个程序,这种程序一般都是作为第三方服务供其他应用在内部调用的)

在活动中使用Toast

Toast是Android系统提供的提示方式,可以提供一些消息的提示,且一段时间后会自动消失

  • findViewById()方法获取到在布局文件中定义的元素,返回一个View对象。Button向下强制类型转换成Button对象,得到按钮的实例
  • 调用setOnClickListener()方法为按钮注册一个监听器,点击按钮时就会执行监听器中的onClick()方法
  • 在onClick()方法中编写Toast
  • Toast调用静态方法makeText()创建出一个Toast对象然后调用show()方法。makeText()需要调用三个参数Toast toast = Toast.makeText(context,"", time);
    (1) 第一个参数Context,即Toast所要求的上下文,由于活动本身就是一个Context,因此可直接传入FirstAvtivity.this.
    (2) 第二个参数是Toast显示的文本内容
    (3) 第三个参数是Toast内容显示的时长,有两个内置常量可以选择Toast.LENGTH_SHORTToast.LENGTH_LONG
public class FirstActivity extends AppCompatActivity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.first_layout);
		
		// 使用Toast
		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();
			}
		});
	}
}

在活动中使用Menu

  1. res -> menu -> main.xml, 在main.xml文件中添加如下代码:
<menu xmlns:android="http://schemas.android.com/apk/res/android">
	<item
	android:id="@+id/add_item"
	android:title="Add"/>
	<item
	android:id="@+id/remove_item"
	android:title="Remove"/>
menu>
	

标签是用来创建Menu里一个具体项的,然后通过android:id给这个菜单项指定一个唯一的标识符,通过android:title指定一个名称

  1. 然后回到FirstActivity中重写onCreateOptionsMenu()方法:
  • 调用getMenuInflater()方法创建MenuInflater对象,再调用它的inflate()方法给当前活动创建菜单。
  • inflate()接收两个参数,第一个参数用于指定通过哪个资源文件来创建菜单,第二个参数用于指定我们菜单项将添加到哪一个Menu对象当中
public void onCreateOptionsMenu(Menu menu) {
	getMenuInflater().inflate(R.menu.main, menu);
	return true;
}
  1. 定义菜单响应事件,在FirstActivity中重写onOptionsItemSelected()方法:
    通过item.getItemId()方法来判断我们获取点击的是哪个菜单项,然后给每个菜单项加入自己的逻辑处理。
public boolean onOptionsItemSelected(MenuItem item){
	switch (item.getItemId()) {
		case R.id.add_item:
			Toast.makeText(this, "You click add", Toast.LENGTH_SHORT).show();
			break;
		case R.id.remove_item:
			Toast.makeText(this, "You click remove", Toast.LENGTH_SHORT).show();
			break;
		default:;
	}
	
	return true;	
}

销毁一个活动

  1. 直接按Back键
  2. 在程序中通过代码来销毁活动,Activity类提供了一个finish()方法,在活动中调用一下这个方法就可以销毁当前活动了。比如修改监听器中的代码,如下所示:
button1.setOnClickListener(new View.OnClickListener() {
	@override
	public void onClick(View v) {
		finish();
	}	
});

重新运行程序,点击一下按钮,当前的活动就被成功销毁了,效果和按下Back键是一样的。

使用Intent在活动之间穿梭

在启动器中点击应用图标只会进入到该应用的主活动,如何跳转到其他活动?

显示Intent

创建一个新的的Activtiy:
com.example.avtivitytest 包 -> new Empty Activity -> SecondActivity, Layout File -> second_layout.xml, 不要设置为Launcher Activity

添加一个Button_2按钮:

<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="Button_2"
	/>
LinearLayout>

AndroidManifest.xml新注册一个activity,因为SecondActivity不是主活动,所以不用注册配置

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	package="com.example.activitytest">
	<application
		......
		......>
		<activity android:name=".FirstActivity"
			android:label="This is FirstActivity">
			<intent-fliter>
				<action android:name="android.intent.action.MAIN"/>
				<category android:name="android.intent.category.LAUNCHER"/>
			<intent-fliter>
		activity>
		<activity android:name=".SecondActivity">activity>
	application>
mainfest>

启动第二个Activity: Intent
Intent有多个构造函数重载,其中一个是Intent(Context packageContext, Class cls).第一个参数Context对象指定了启动活动的上下文,第二个参数是一个Class,指定要启动那个活动。通过Activity类中的startActivity()方法来启动活动,给该方法传入一个Intent对象即可。
修改FirstActivity中按钮的点击事件,代码如下所示:

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

这样就在FirstActivity活动的基础上创建了SecondActivity这个活动。这种方式来启动活动,Intent的意图非常明显,因此称之为显式Intent

隐式Intent

隐式Intent并不明确指明要启动哪一个活动,而是指定了一系列的action和category等信息,然后交由系统去分析这个Intent, 并帮我们找出合适的活动去启动。通过在标签下配置的内容可以指定当前活动能够响应的action和category,只有action和category的内容同时能够匹配上Intent中指定的action和category时,活动才能响应该Intent。

打开AndroidManifest.xml,添加如下代码:

<activity android:name="./SeconndActivity">
	<intent-fliter>
		<action android:name="com.example.activitytest.ACTION_START" />
		<category android:name="android.intent.category.DEFAULT" />
	intent-fliter>
activity>

修改FirstActivity中按钮的点击事件,代码如下所示:

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

这里使用了Intent的另一个构造函数,将action的内容传了进去,表明想启动能够响应该action的activity。这里没有指定category,是因为android.intent.category.DEFAULT是默认的category,在调用startActivity()方法时会自动将这个category添加到intent中。

每个Intent只能指定一个action,但可以指定多个category,可以通过调用intent的addCategory()方法来添加一个category。

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

与此同时,不要忘记在activity中同步添加该category,否则程序运行会报错。

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

更多intent隐式用法

使用隐式Intent,使得Android多个应用程序之间的共享成了可能,比如在在程序中展示一个网页,这时只需要调用系统的浏览器即可而不必自己去实现一个浏览器。


一、将FirstActIvity中的按钮点击事件的代码修改成如下:

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

Intent的Action是Intent.ACTION_VIEW,这是一个Android系统内置的动作,其常量值为android.intent.action.VIEW。然后,通过Uri.parse(),将一个网址字符串解析成了一个Uri对象,再调用Intent的setData()方法将这个Uri对象传递进去。

二、我们还可以在标签中再配置一个标签,用于更加精确地指定当前活动能够影响什么类型的数据。标签主要可以配置如下内容:

  • android:scheme:用于指定数据的协议部分
  • androId:host:指定数据的主机名部分
  • android:port:指定数据的端口部分
  • android:path:用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容
  • android:mimeType:用于指定可以处理的数据类型,允许使用通配符

只有Intent对象中携带的Data与intent-fliter中标签指定的内容完全一致时,当前活动才能够影响该Intent。如指定android:scheme为http,就可以相应所有的http协议的Intent了。

三、建立一个活动,使其能够响应打开网页的Intent。
com.example.activitytest -> New Activity -> EmptyActivIty-> ThirdActivity,勾选Generate Layout File,布局文件命名为third_layout,点击Finish完成创建。然后编辑Third_layout.xml文件:

<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_3"
		android:layout_width="match_parent"
		android:layout_height="wrap_content"
		android:text="Button_3"
	/>
LinearLayout>

然后在AndroidManifest.xml中修改ThirdActivity的注册信息:

<activity android:name=".ThirdActivity"
	android:label="This is ThirdActivity">
	<intent-fliter>
		<action android:name="android.intent.action.VIEW"/>
		<category android:name="android.intent.category.DEFAULT"/>
		<data android:scheme:"http />
	<intent-fliter>
activity>

配置了当前活动能够响应的action是Intent.ACTION_VIEW的常量值,category是默认值,此外,在data中通过android:sheme指定了数据的协议必须是http协议,这样一来,ThIrdActivity应该就和浏览器一样,能够相应一个打开网页的Intent了。
Android-Activity(一)启动活动_第1张图片


除了http协议外,还可以指定很多其他的协议,比如geo表示显示地理位置,tel表示拨打电话。下面展示了如何在程序中调用系统拨号界面。

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);
	}
});

Intent.ACTION_DIAL是Android系统的一个内置动作,在data部分指定协议是tel。重新运行程序,在FirstActivity的界面点击按钮,会显示如下:
Android-Activity(一)启动活动_第2张图片

你可能感兴趣的:(Android,android,android,studio)