纯属笔记

android基础

Android 系统没有使用常见的应用程序入口点的方法(例如C语言中的 main() 方法),应用程序是由组件组成的,组件可以调用相互独立的基本功能模块。根据完成的功能不同,Android 划分了 4 类核心组件,即 Activity、Service、BroadcastReceiver 和 ContentProvider,各组件之间的消息传递通过 Intent 完成。

Activity

  • Activity 是用户和应用程序交互的窗口。

在 Android 应用程序中,一个 Activity 通常对应一个单独的视图。

一个 Android 应用程序是由一个或多个 Activity 组成的,这些 Activity 相当于 Web 应用程序中的网页,用于显示信息,并且相互之间可以进行跳转。和网页跳转不同的是,Activity 之间的跳转可以有返回值

新打开一个视图时,之前的那个视图会被置为暂停状态,并且压入历史堆栈中,用户可以通过回退操作返回以前打开过的视图。Activity 是由 Android 系统进行维护的,它有自己的生命周期,即“产生、运行、销毁”,但是在这个过程中会调用许多方法,如创建 onCreate()、激活 onStart()、恢复 onResume()、暂停 onPause()、停止 onStop()、销毁 onDestroy()和重启 onRestart() 等。

状态转换

  • 各种状态转换图

Activity生命周期

Activity 的整个生命周期

使用

1) 新建类

创建一个 Activity,必须创建 Android.app.Activity(或者它的一个已经存在的子类)的一个子类,并重写 onCreate() 方法。

2) 关联布局 XML 文件

在新建的 Activity 中设置其布局方式,需要在 res/layout 目录中新建一个 XML 布局文件,可以通过 setContentView() 来指定 Activity 的用户界面的布局文件。

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

3) 注册

在 AndroidManifest.xml 文件中对建立的 Activity 进行注册,即在 标签下添加 标签。例如,注册 ExampleActivity 的代码如下:

  • 一般的注册
<manifest ... >
<application ... >
<activity android:name = ".ExampleActivity" />
...
</application ... >
...
</manifest >
  • 主activity使用
<activity Android:name = ".ExampleActivity" Android:icon = "@drawable/app_icon">
<intent-filter>
<action Android:name = "Android.intent.action.MAIN" />
<category Android:name = "Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
  • 表示该 Activity 作为主 Activity 出现。
  • 表示该 Activity 会被显示在最上层的启动列表中。

4) 启动

在 Android 系统中,除了主 Activity 由系统启动外,其他 Activity 都要由应用程序来启动。

1)通常情况下,通过 startActivity() 方法来启动 Activity,而要启动的 Activity 的信息由 Intent 对象来传递,例如:
Intent intent = new Intent(this,AnotherActivity.class);
startActivity(intent);

表示通过当前的 Activity 启动名为 AnotherActivity 的 Activity。

有时,用户不需要知道要启动的 Activity 的名字,而可以仅制定要完成的行为Action,由 Android 系统来为用户挑选合适的 Activity,例如:

Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_EMAIL,recipientArray);
startActivity(intent);

其中,Intent.EXTRA_EMAIL 放置的是 recipientArray 中存储的要发送的 E-mail 的目标地址。该 Intent 对象被 startActivity() 启动后,Android 系统会启动相应的 E-mail 处理应用程序,并将 Intent.EXTRA_EMAIL 中的内容放置到邮件的目标地址中。

2)有时,当需要从启动的 Activity 获取返回值的时候,需要使用 startActivityForResult() 方法代替 startActivity() 方法,并实现 onActivityResult() 方法来获取返回值。

例如,在发送短信的时候,用户需要从联系人列表中获取联系人的信息,然后返回到短信发送界面,代码如下:

Intent intent = new Intent(Intent.ACTION_PICK,Contacts.CONTENT_URI);
startActivityForResult(intent,PICK_CONTACT_REQUEST);

当用户选择了联系人后,相关信息会被存储到 Intent 对象中,并返回到 onActivityResult() 方法中。

###### startActivityForResult举例

  • MainActivity
public class MainActivity extends Activity implements View.OnClickListener {
...
public static int REQUEST_CODE = 1;
private String editText = "hello ";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
}

@Override
public void onClick(View v) {
Intent intent = new Intent(this, OtherActivity.class);
intent.putExtra("text", editText);
startActivityForResult(intent, REQUEST_CODE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == REQUEST_CODE && resultCode == OtherActivity.RESULT_CODE) {
editText = (data.getStringExtra("text"));
}
}
}
  • OtherActivity
public class OtherActivity extends Activity implements View.OnClickListener {
...
public static int RESULT_CODE = 1;
private String editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
editText= getIntent().getStringExtra("text");
}

@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("text", editText+"you too");
setResult(RESULT_CODE, intent);
finish();
}
}

以上是双向的通信,

  1. mainactivity 通过调用startActivityForResult向OtherActivity传递必要的 intent(封装传递信息edittext)和request_code ,打开OtherActivity窗口,mainActivity停止。
  2. OtherActivity接收打开后,收取edittext内容。在OtherActivity操作激活 onCLick事件后,通过创建新的intent将内容修改和result_code 并通过setResult方法发送给MainActivity,然后当前窗口关闭。
  3. MainActivity通过调用onActivityResult方法获取传递过来的intent来获取 传递的内容。

其中通信核心就是 setResul(int RESULT_CODE, Intent intent )t 和getIntent()来实现intent的传递。 其中startActivityForResult用于启动一个新的activity并要求返回intent,onActivityResult方法相当于intent传递过程中的一个Filter(过滤器根据不同的请求码\结果码来调用相应的处理方法)。

当然Activity之间的数据传递除了intent还有 Bundle,其区别就是: Intent 传递一些简单的数据类型 Bundle可以传递复杂的数据或者对象。 举例:
Intent intent = new Intent(Activity1.this,Activity2.class);
Bundle myBundle = new Bundle();
myBundle.putString("author","leebo");
intent.putExtras(myBundle);
Activity1.this.startActivity(intent);
Intent intent = getIntent();
Bundle myBundle = intent.getExtras();
String value = myBundle.getString("author"); //根据键名 author 取出对应键值为 "leebo"

Service

Service 是一种类似于 Activity 但是没有视图的程序,它没有用户界面,可以在后台运行很长时间,相当于操作系统中的一个服务

Android 定义了两种类型的 Service,即本地 Service 和远程 Service。本地 Service 是只能由承载该 Service 的应用程序访问的组件,而远程 Service 是供在设备上运行的其他应用程序远程访问的 Service。

通过 Context.startService(Intent service) 可以启动一个 Service,通过 Context. bindService() 可以绑定一个 Service。

BroadcastReceiver

BroadcastReceiver 的意思是“广播接收者”,顾名思义,它用来接收来自系统和其他应用程序的广播,并做出回应

在 Android 系统中,当有特定事件发生时就会产生相应的广播。广播体现在方方面面。例如,当开机过程完成后,系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能;当网络状态改变时,系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作;当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户及时保存进度等。

BroadcastReceiver 不能生成 UI,通过 NotificationManager 来通知用户有事件发生,对于用户来说是隐式的。

BroadcastReceiver 的 2 种注册方式:

  • 在 AndroidManifest. xml 中进行静态注册;
  • 在运行时的代码中使用 Context.registerReceiver() 进行动态注册。

只要注册了 BroadcastReceiver,即使对应的事件广播来临时应用程序并未启动,系统也会自动启动该应用程序对事件进行处理。另外,用户还可以通过 Context.sendBroadcast() 将自己的 Intent 对象广播给其他的应用程序。

ContentProvider

文件、数据库等数据在 Android 系统内是私有的,仅允许被特定应用程序直接使用。在两个程序之间,数据的交换或共享由 ContentProvider 实现。

ContentProvider 类实现了一组标准方法的接口,从而能够让其他的应用保存或读取 ContentProvider 提供的各种数据类型。

Intent

Intent 并不是 Android 应用程序四大核心组件之一,但是其重要性无可替代,因此在这里我们做一下简单介绍。

Android 应用程序核心组件中的三大核心组件 —— Activity、Service、BroadcastReceiver。通过消息机制被启动激活,而所使用的消息就是 Intent。Intent 是对即将要进行的操作的抽象描述,承担了 Android 应用程序三大核心组件相互之间的通信功能。