- 组件简介:
- 活动(Activity) - 用于表现功能,最为常用
- Android的任务、进程和线程详解
- 任务
- 进程
- 线程
- 应用程序的生命周期
- Activity的生命周期
- Intent对象
- 页面跳转生命周期
- 跳转带返回值
- 结果展示
Android应用程序由下列组件组成:
- Activity - 用于表现功能
- Service - 相当于后台运行的 Activity
- Broadcast Receiver - 用于接收广播
- Content Provider - 内存承载器
- …
- 每一个Activity都要在AndroidManifest.xml中声明
- Android应用程序的任务、进程和线程
Android系统管理任务和返回栈的方式,就是把所有启动的Activity都放入到一个相同的任务当中,通过一个“后进先出”的栈来进行管理的。
| 事件 | Task栈 |
|---|---|
| A:点击Email应用,进入收件箱 | A |
| B:选中一封邮件,点击查看详细 | A,B |
| C:点击回复,开始写新邮件 | A,B,C |
| D:点击选择联系人,进入选择联系人界面 | A,B,C,D |
| C:选择号了联系人后,继续写邮件 | A,B,C |
| B:写好邮件,发送完成,回到原始邮件 | A,B |
| A:点击返回,回到收件箱 | A |
| 退出Email | Null |
- 进程是低级核心处理过程,用于运行应用程序代码
- 组件运行的进程由AndroidManifest.xml控制
- 分类为:前台进程,可见进程,服务进程,后台进程,空进程
① 前台进程:正在前台运行的进程,是必须的用户操作,不到万不得已不会被kill。
前台进程包括:
- 拥有用户正在交互的 Activity(已调用 onResume())
- 拥有某个 Service,后者绑定到用户正在交互的 Activity
- 拥有正在“前台”运行的 Service(服务已调用 startForeground())
- 拥有正执行一个生命周期回调的 Service(onCreate()、onStart() 或 onDestroy())
- 拥有正执行其 onReceive() 方法的 BroadcastReceiver
② 可见进程:没有任何前台组件、但仍会影响用户在屏幕上所见内容的进程,一般也不会被kill。
可见进程包括:
- 拥有不在前台、但仍对用户可见的 Activity(已调用 onPause())
- 拥有绑定到可见(或前台)Activity 的 Service
③ 服务进程:它们通常在执行一些用户关心的操作,除非内存不足以维持所有前台进程和可见进程同时运行,否则系统会让服务进程保持运行状态。
服务进程包括:
- 正在运行 startService() 方法启动的服务,且不属于上述两个更高类别进程的进程。
④ 后台进程:后台进程对用户体验没有直接影响,系统可能随时终止它们,以回收内存供前台进程、可见进程或服务进程使用。通常会有很多后台进程在运行,因此它们会保存在 LRU 列表中,以确保包含用户最近查看的 Activity 的进程最后一个被终止。如果某个 Activity 正确实现了生命周期方法,并保存了其当前状态,则终止其进程不会对用户体验产生明显影响,因为当用户导航回该 Activity 时,Activity 会恢复其所有可见状态。
后台进程包括:
- 对用户不可见的 Activity 的进程(已调用 Activity的onStop() 方法)
⑤空进程:保留这种进程的的唯一目的是用作缓存,以缩短下次在其中运行组件所需的启动时间。 为使总体系统资源在进程缓存和底层内核缓存之间保持平衡,系统往往会终止这些进程。
空进程包括:
- 不含任何活动应用组件的进程
- 每个进程有一到多个线程运行
- 进程中的所有组件都在UI线程中实例化,以保证应用程序是单线程的
- 线程通过java的标准对象Thread创建
- 永远要记住:
- 不要阻塞UI线程!
- 不能再非UI线程中更新UI!
- 应用程序的生命周期是指从创建到结束的全过程
- Android框架管理而不是通过应用程序管理
oncreate()->onstart()->onResume()->onRestart()->onPouse()->onStop()->onDestory()
- 被一个Activity栈管理
- 五个状态:启动,运行,暂停,停止,销毁
- 启动:Activity被压入栈顶
- 运行:在栈顶的Activity就是处于运行状态。
- 暂停:不处于栈顶但是仍然用户可见的活动,该活动就是处于暂停状态。
- 停止:当Activity完全不可见时,它处于停止状态,如果系统内存不足,那么这种状态下的Activity很容易被销毁。
- 销毁:Activity从栈中移除
Intent - 用于连接以上各个组件,并在其间传递消息
BroadcastReceiver - 用于接收广播
在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。
- 俩个activity之间的跳转
Intent intent = new Intent(this , SencondActivity.class);
startActivity(intent); - 返回
finish(); - 带数据操作
startActivityForResult(new Intent(this , DeviceListActivity.class),1);
代码示例:
主界面 activity_man.xml:
跳转到第二个界面 second.xml
string.xml
LiftTest 跳转 返回 发送数据
主程序Mainactivity.java
package com.zufe.hmf;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
public MainActivity() {
super();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("com.hmf","onCreate A");
}
public void go(View view){
Toast.makeText(this,"按下了跳转按钮",Toast.LENGTH_SHORT).show();
Intent intent = new Intent(this , Second.class);
startActivity(intent);
}
@Override
protected void onStart() {
super.onStart();
Log.i("com.hmf","onStart A");
}
@Override
protected void onRestart() {
super.onRestart();
Log.i("com.hmf","onRestart A");
}
@Override
protected void onStop() {
super.onStop();
Log.i("com.hmf","onStop A");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i("com.hmf","onDestroy A");
}
@Override
protected void onPause() {
super.onPause();
Log.i("com.hmf","onPause A");
}
@Override
protected void onResume() {
super.onResume();
Log.i("com.hmf","onResume A");
}
}
跳转到第二个Second.java
package com.zufe.hmf;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import androidx.appcompat.app.AppCompatActivity;
public class Second extends AppCompatActivity {
public Second() {
super();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
Log.i("com.hmf","onCreate B");
}
public void OnCancel(View view) {
Intent intent = new Intent(this , MainActivity.class);
startActivity(intent);
}
@Override
protected void onStart() {
super.onStart();
Log.i("com.hmf","onStart B");
}
@Override
protected void onRestart() {
super.onRestart();
Log.i("com.hmf","onRestart B");
}
@Override
protected void onStop() {
super.onStop();
Log.i("com.hmf","onStop B");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i("com.hmf","onDestroy B");
}
@Override
protected void onPause() {
super.onPause();
Log.i("com.hmf","onPause B");
}
@Override
protected void onResume() {
super.onResume();
Log.i("com.hmf","onResume B");
}
}
注意!!!新建的Activity都要在AndroidManifest.xml中声明!!!
AndroidManifest.xml:
运行程序:
## 观察Run运行栏发现如下返回值:
跳转带返回值俩个跳转方法代码修改如下:
public void go(View view){
Toast.makeText(this,"按下了跳转按钮",Toast.LENGTH_SHORT).show();
startActivityForResult(new Intent(this , DeviceListActivity.class),1);
}
public void OnCancel(View view) {
Bundle bundle = new Bundle();
bundle.putString("returnData","B");
Intent it = new Intent();
it.putExtras(bundle);
setResult(RESULT_OK,it);
finish();
}
带参数返回需要重写onActivityResult(int requestCode, int resultCode, @Nullable Intent data)方法
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
String result = data.getExtras().getString("return");
//Log.i(TAG,result);
TextView textView = findViewById(R.id.textView);
textView.setText(result);
}
当然,也可以自己另外写一个input输入框来输入想要传输的数据,在xml中加入一个输入框:
可以通过getText来获取输入的数据
EditText text = findViewById(R.id.INPUT);
String data = text.getText();
结果展示



