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.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是Android系统提供的提示方式,可以提供一些消息的提示,且一段时间后会自动消失
findViewById()
方法获取到在布局文件中定义的元素,返回一个View对象。Button向下强制类型转换成Button对象,得到按钮的实例setOnClickListener()
方法为按钮注册一个监听器,点击按钮时就会执行监听器中的onClick()
方法Toast toast = Toast.makeText(context,"", time);
Toast.LENGTH_SHORT
和Toast.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 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
指定一个名称
onCreateOptionsMenu()
方法:getMenuInflater()
方法创建MenuInflater对象,再调用它的inflate()
方法给当前活动创建菜单。public void onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
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;
}
button1.setOnClickListener(new View.OnClickListener() {
@override
public void onClick(View v) {
finish();
}
});
重新运行程序,点击一下按钮,当前的活动就被成功销毁了,效果和按下Back键是一样的。
在启动器中点击应用图标只会进入到该应用的主活动,如何跳转到其他活动?
创建一个新的的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并不明确指明要启动哪一个活动,而是指定了一系列的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,使得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对象传递进去。
二、我们还可以在
只有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了。
除了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的界面点击按钮,会显示如下: