Android学习笔记二之初始Activity

时间:2023-03-08 23:40:16
Android学习笔记二之初始Activity

初识Activity,跟着教程学习敲了一遍这一章的内容,下面根据目录结构总结知识点:

一、活动是什么

  上篇博文中我们提到了Android四大组件,其中有一个Activity,我们将之称为活动。活动是最容易吸引用户的地方,它包含用户界面的组件,主要和用户进行交互。

  我们可以用HTML页面的例子理解:

    每一个HTML页面中有各种HTML元素,例如按钮、文本框等,这些元素存在HTML网页中并通过HTML展示、或与我们交互,

    我们可以把一个HTML网页看成一个活动,它也是用来包含各种组件与用户交互的。

二、活动的基本用法

  1、手动创建活动

    展开java目录,在我们的包名上右键——New——Activity——Empty Activity(可选其他样式),出现配置活动的对话框,其中各选项上篇博文已解释过,其中Launcher Activity表示设置此活动为主活动,我们不勾选,Finish完成创建。

  2、创建并加载布局

    创建活动时默认勾选Generate Layout File以生成对应的布局文件,如若要自行创建我们可以在layout目录上右键——New——Layout resource file,在对话框中我们填写布局文件名称及布局方式。

  3、在AndroidManifest.xml中注册

    上篇博文中我们说过应用中所有的四大组件都必须在配置文件中进行注册,没有注册的活动是不能使用的。 我们可以将主活动从配置文件中去掉,你会发现项目都起不来。

  4、销毁一个活动

    我们可以使用finish()方法销毁一个活动

三、使用Intent在活动间穿梭

Q:主活动是点击应用图标启动的活动,那么怎么启动另一个活动呢?

A:Intent(我不知道还有没有其他的启动方法,一步步来)

  1、Intent的概念

    Intent这个英语单词的本意是意图、目的。Intent是一种运行时绑定(runtime binding)机制,它能在程序运行的过程中连接两个不同的组件。用于向其他组件发送请求。根据Intent种类分为:显式Intent、隐式Intent。

  2、显式Intent(明确指定需要启动的目标组件)

    要启动一个名叫SecondActivity活动时我们可以这样写:

 button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//创建指定目标活动的Intent对象
//第一个参数是Context对象,Activity是Context子类,所以所有的Activity都可以向上转型为Context对象
//第二个参数是Class对象,当前情景应该传入目标活动的Class对象
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
}
});

    如需启动一个带有返回值的活动,我们可以将第8行改为:

 startActivityForResult(intent, 1);//第二个参数是一个int类型的请求码

    怎么在SecondActivity活动中返回参数呢,我们可以这样写:

 button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(SecondActivity.this, FirstActivity.class);
intent.putExtra("data_return", "Hello FirstActivity");
setResult(RESULT_OK, intent);//第一个参数是int类型的resultCode
finish();//销毁活动
}
});

    如何在FirstActivity中接受SecondActivity活动返回的参数呢?我们可以在FirstActivity中重写onActivityResult(int requestCode, int resultCode, Intent data)方法,我们可以这样写:

     @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {//还记得我们启动SecondActivity活动传过去的请求码吗
case 1:
if (resultCode == RESULT_OK) {//判断结果码
//因为FirstActivity返回的是String类型的参数,所以我们调用getStringExtra()方法,int类型我们可以调用getIntExtra()方法,以此类推
String returnedData = data.getStringExtra("data_return");
Log.d("FirstActivity", returnedData);//打印日志,debug层级
}
break;
default:
}
}

  3、隐式Intent(并不明确指定要启动的活动,而是指定一系列抽象的action和category信息,交由系统分析找出适合的活动去启动)

    Q:什么叫适合的活动呢?

    A:简单说就是可以响应我们隐式Intent的活动。

    我们可以在AndroidManifest.xml中的活动中配置<intent-filter>指定当前活动能响应的action和category。打开配置文件,修改SecondActivity活动,修改代码成如下:

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

在action中我们指定了当前活动可以响应 com.example.zhangshuaige.activitytest.ACTION_START这个action,<category>标签包含一些附加信息,更精确的指明了当前活动能够响应的Intent中还可能带有的category。只有两个标签中的内容都匹配上Intent中指定的action和category时,这个活动才能响应该Intent。

修改FirstActivity活动中的onClick()方法,我们可以这样写:

 button1.setOnClickListener(new View.OnClickListener(){

             @Override
public void onClick(View view) {
Intent intent = new Intent("com.example.zhangshuaige.activitytest.ACTION_START");
startActivity(intent);//默认就是default category
}
});

Android学习笔记二之初始Activity

在FirstActivity活动界面我们点击button1我们成功启动了SecondActivity活动,如下:

Android学习笔记二之初始Activity

每个Intent中只能指定一个action,但是能指定多个category,目前Intent中中有default category,现在我们再加一个,修改FirstActivity活动中的onClick()方法,代码如下:

 button1.setOnClickListener(new View.OnClickListener(){

             @Override
public void onClick(View view) {
Intent intent = new Intent("com.example.zhangshuaige.activitytest.ACTION_START");
intent.addCategory("com.example.zhangshuaige.activitytest.MY_CATEGORY");//添加代码
startActivity(intent);
}
});

再运行一次,你会发现程序 挂了:

Android学习笔记二之初始Activity

查看logcat,有如下错误信息:

Android学习笔记二之初始Activity

错误信息提示我们,没找到可以响应我们Intent的活动,原因就是我们新加了一个category,但是并没有在SecondActivity的<intent-filter>标签中声明,现在让我们去添加一个:

 <activity android:name=".SecondActivity" >
<intent-filter>
<action android:name="com.example.zhangshuaige.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.example.zhangshuaige.activitytest.MY_CATEGORY" /><!--新增代码-->
</intent-filter>
</activity>

再次运行,没毛病。

  除了启动自己程序的活动还可以启动其他程序的活动,例如调用系统浏览器打开百度首页,

调用拨号盘拨10086等等

在FirstActivity中修改onClick()方法参考如下6-8 10-12两段:

 button1.setOnClickListener(new View.OnClickListener(){

              @Override
public void onClick(View view) { Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent); //启动活动 //Intent intent1 = new Intent(Intent.ACTION_VIEW);
      //intent1.setData(Uri.parse("http://www.baidu.com"));
//startActivity(intent1); //Intent intent = new Intent("com.example.zhangshuaige.activitytest.ACTION_START");
//intent.addCategory("com.example.zhangshuaige.activitytest.MY_CATEGORY");
//startActivity(intent);
//Toast.makeText(FirstActivity.this,"You clicked Button 1",
// Toast.LENGTH_SHORT).show();
// finish(); 销毁活动
//优化写法
//SecondActivity.actionStart(FirstActivity.this, "data1", "data2");
}
});

更多隐式Intent等你自己去发现了~

四、活动的声明周期

  1、返回栈

    Android是使用任务来管理活动,一个任务就是一组存放在栈里的活动的集合,这个栈叫返回栈。栈是一种数据结构,先入后出。

  2、活动的状态

    a、运行状态   活动位于栈顶

    b、暂停状态   活动不位于栈顶,但可见

    c、停止     活动不可见

    d、销毁     活动出栈

  3、活动的声明周期

    活动声明周期主要由Activity类中的几个方法体现:

    我们已经见过的onCreate() 活动第一次创建时被调用;onStart() 活动由不可见变为可见时调用;onResume() 活动位于栈顶,准备和用户交互时调用;onPause() 活动准被启动另一活动时调用;onStop() 活动完全不可见时调用;onDestroy() 活动销毁之前调用;onRestart() 活动由停止变为运行时调用;

    下面是张别人的图:

Android学习笔记二之初始Activity

建议可以自己重写这几个方法然后打印日志,会比较直观的看到效果。

五、活动的启动模式

  1、standard   总是创建新的该活动实例

  2、singleTop  查看栈顶活动是否为此活动,如果不是,创建新的此活动实例

   3、singleTask  查看整个栈是否存在此活动,存在则将此活动上的所有活动出栈,将此活动处于栈顶,不创建新的此活动实例

  4、singleInstance  使用独立的返回栈对此活动进行管理,用于共享实例

*可以自己去修改配置文件中的Activity试试,例如:

<activity
android:name=".FirstActivity"
android:launchMode="singleTask"
android:label="This is FirstActivity"><!--Look This "android:launchMode"-->
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SecondActivity"
android:launchMode="singleInstance">
<intent-filter>
<action android:name="com.example.zhangshuaige.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.example.zhangshuaige.activitytest.MY_CATEGORY" />
</intent-filter>
</activity>

六、好的编写活动手法(别人书籍里写的)

  接手一个旧项目,不知道单前活动是那个Activity,可以自己写一个类继承Activity或其子类,在onCreate()方法中打印日志,让其他类继承自己编写的类。

  随时随地退出程序:常见一个集合,管理所有实例,清除所有活动。

  启动活动好的写法:编写一静态方法,在方法中对Intent进行参数绑定

好了,初识Activity就写到这里,感谢所有分享知识的人,我所看的书和用的软件都在上上篇博文底有链接,自取。有写的不对的地方欢迎指正。有朋友说安卓前景不好,其实我也不关注好不好,只是周末无聊,学点东西挺好,又不知道学什么,感觉每天都用到那么多app,自己学学,捣鼓捣鼓瞎玩不也不错嘛!加油