Activity组件&&Service组件笔记

第一章:Activity组件
0.概述:
1. Activity用于显示用户界面,用户通过Activity交互完成相关操作
2. 一个App允许有多个Activity
3.安卓系统使用栈来存储Activity,先进后出
4.四种状态:
1.运行:可见
2.暂停:仍然可见,只是不能操作 例如:程序退出时的消息对话框
3.停止:不可见
4.销毁:强制停止程序,不可见
1.生命周期:Activity1
1.首次被创建时调用onCreat()方法,显示给用户调用onstart方法,如果活动位于前台就调用onResume方法
2.使用onPause方法覆盖当前活动,并将数据保存起来。可以使用onPause方法停止前一个活动,可以使用onResume让它重新位于前台
3.onStop后可以使用onDestory销毁活动,并使用finish关闭活动
4.内存资源不足时就会杀死onPause的活动进程
注意:onPause()和onStop()被调用的前提是: 打开了一个新的Activity!而前者是旧Activity还可见的状态;后者是旧Activity已经不可见!
2.创建流程:Activity2
1.自定义Activity类名,继承Activity类或者是其子类
2.重写onCreat方法,调用setContentView()设置要显示的视图
3.布局文件中进行配置 在AndroidManifest中进行配置,以上三步可以使用系统的创建Activity,减少了布局文件和重写方法的麻烦
4.启动活动,调用startActivity(Intent),由此可见在调用该方法时需要创建Intent对象。一般有两种情况
1.入口Activity,在AndroidManifest.xml文件中配置,配置好后这个Activity就会作为应用程序的启动项
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
2.其他Activity,一般项目不会只有一个Activity,为此需要在MainActivity中启动另一个Activity
可以入口Activity的全局配置文件中增加一个按钮,用于切换至其他Activity,实现过程需添加事件监听器。
5.关闭Activity:调用finish,直接关闭当前Activity,如果关闭的Activity不是主Activity,那么会直接回到主Activity中
3.onCreate()一个参数和两个参数的区别:
0.Activity持久化:配置文件中添加:android:persistableMode="persistAcrossReboots"
1.搭配两个方法来使用:
1.public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState)
使用条件:
1.点击home键回到主页或长按后选择运行其他程序
2.按下电源键关闭屏幕
3.启动新的Activity
4.横竖屏切换时,肯定会执行
2.public void onRestoreInstanceState(Bundle savedInstanceState, PersistableBundle persistentState)
和onCreate同样可以从取出前者保存的数据: 一般是在onStart()和onResume()之间执行! 之所以有两个可以获取到保存数据的方法,是为了避免Act跳转而没有关闭, 然后不走onCreate()方法,而你又想取出保存数据
4.启动新的Activity方式
1.显示启动:
1.最常见的:startActivity(new Intent(当前Act.this,要启动的Act.class));
2.通过Intent的ComponentName:
ComponentName cn = new ComponentName("当前Act的全限定类名","启动Act的全限定类名") ;
Intent intent = new Intent() ;
intent.setComponent(cn) ;
startActivity(intent) ;
3.初始化Intent时指定包名:
Intent intent = new Intent("android.intent.action.MAIN");
intent.setClassName("当前Act的全限定类名","启动Act的全限定类名");
startActivity(intent);
2.隐式启动:隐式启动:通过Intent-filter的Action,Category或data来实现 这个是通过Intent的 intent-filter**来实现
3.直接通过包名启动apk(Android application package):
Intent intent = getPackageManager().getLaunchIntentForPackage
("apk第一个启动的Activity的全限定类名") ;
if(intent != null) startActivity(intent) ;
5.横竖屏切换与状态保存问题:
1.横竖屏切换时Act走下述生命周期:onPause-> onStop-> onDestory-> onCreate->onStart->onResume
2.禁止屏幕横竖屏自动切换:在AndroidManifest.xml中为Act添加一个属性: android:screenOrientation 具体类型可以参考文档
3.横竖屏时加载不同的布局:
1.Android会自己根据横竖屏加载不同布局: 创建两个布局文件夹:layout-land横屏,layout-port竖屏 然后把这两套布局文件丢这两文件夹里,文件名一样,Android就会自行判断,然后加载相应布局了!
2.自己在代码中进行判断,自己想加载什么就加载什么:一般是在onCreate()方法中加载布局文件的,我们可以在这里对横竖屏的状态做下判断
if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
setContentView(R.layout.横屏);
}
else if (this.getResources().getConfiguration().orientation ==Configuration.ORIENTATION_PORTRAIT) {
setContentView(R.layout.竖屏);
}
3.模拟器横竖屏切换:原生模拟器可按ctrl + f11/f12切换
4.状态保存问题:通过一个Bundle savedInstanceState参数即可完成! 三个核心方法:
onCreate(Bundle savedInstanceState);
onSaveInstanceState(Bundle outState);
onRestoreInstanceState(Bundle savedInstanceState);
6.Activity之间的数据传递:只介绍基本数据传递,关于传递集合,对象,数组,Bitmap会在Intent那里讲解
1.Activity之间的数据传递:
1.Intent的概念:Intent是一种运行时绑定机制,它能在程序运行的过程中连接两个不同的组件,两个Activity之间的信使
2.Intent的创建与使用:
a.Intent的创建
                Intent intent = new Intent(MainActivity.this,OtherActivity.class);(有多种构造器,这里只是列举一种)
    b.使用Intent传递数据
              intent.putExtra("name", "李四");
              intent.putExtra("age", 27);
              intent.putExtra("address", "广州黄浦区经济开发区");
    c.启动Intent
              startActivity(intent);
3.Bundle:Activity3 这个例子出现了空指针异常
a.是键值对的组合,使用Bundle在Activity之间传递数据
b.数据的传递过程:数据->putXXX()方法->Bundle->putExtra()方法->Intent->startActivity->Activity
c.模拟淘宝中的填写并显示收货地址的功能,单击保存按钮进入到显示页面,显示刚刚输入的信息

2.多个Activity间的交互:(后一个传回给前一个) 可以用来给用户添加头像 Activity4 其中需要给网格数组指定一个适配器,这个例子不太熟悉,可以再练练
1.创建Activity
2.调用startActivityForResult(Intent intent(用于被指定的Activity),int requestCode(请求码,用来启动Activity,标识请求来源))
3.在启动的Activity中重写onActivityResult()
4.在子Activity重写setResult()
3.继承自定义的类:在OnCreate()方法中添加Log.d("BaseActivity",getClass().getSimpleName());
4.随时关闭所有的Activity与完全退出App方法
5.双击退出程序的两种方法:定义一个变量,来标识是否退出 保存点击时间:
6.为Activity设置过场动画 设置全屏
7.Activity,Task和Back Stack的一些概念
1.Task:Task是Activity的集合,实际使用的Back Stack来存储Activity,可以有多个Task,但是 同一时刻只有一个栈在最前面,其他的都在后台
8.Activity的四种加载模式详解:
1.standard模式:每次启动都会新建一个activity
2.singleTop模式:如果有实例在栈顶,则会复用
3.singleTask模式:只允许在系统中有一个Activity实例
4.singleInstance模式:无论从哪个Task启动Activity都只会创建一个Activity实例
第二章:Service组件
1.基本概念:
1.进程:运行中的程序,系统调度与资源分配的一个独立单位,操作系统会 为每个进程分配一段内存空间!程序的依次动态执行,经历代码的加载,执行, 执行完毕的完整过程!
2.线程:比进程更小的执行单元,每个进程可能有多条线程,线程需要放在一个 进程中才能执行,线程由程序负责管理,而进程则由系统进行调度!
3.多线程的理解:并行执行多个条指令,将CPU时间片按照调度算法分配给各个 线程,实际上是分时执行的,只是这个切换的时间很短,用户感觉到"同时"而已!
4.创建线程的三种方式:继承Thread类 实现Runnable接口
5.Service与Thread线程的区别:
1.Thread是线程,程序执行的最小单元,分配CPU的基本单位
2.Service:能够在后台长期运行,并且没有用户界面的应用程序组件,最常见的用法就是做轮询操作。
6.Service的分类(按照启动方式):
1.StartService()启动Service:指的是Activity组件调用了这个方法后这个服务才启动。
2.BindService()启动Service:Activity组件和Service一起启动,一起停止
3.启动Service后,绑定Service
7.Service不是一个单独的进程,它和它的应用程序在同一个进程中
Service不是一个线程,这样就意味着我们应该避免在Service中进行耗时操作
8.IntentService:IntentService是继承与Service并处理异步请求的一个类,在IntentService中有 一个工作线程来处理耗时操作,请求的Intent记录会加入队列
当一个后台的任务,需要分成几个子任务,然后按先后顺序执行,子任务 (简单的说就是异步操作),此时如果我们还是定义一个普通Service然后 在onStart方法中开辟线程,
然后又要去控制线程,这样显得非常的繁琐; 此时应该自定义一个IntentService然后再onHandleIntent()方法中完成相关任务!
2.创建与配置Service Service1 这里使用的时Start Service
1.创建Service:
1.在AndroidStudio中新建Service后,要在service中重写onCreat onStartCommand onDestory方法
2.首先判断Service是否正在运行,可以调用如下的方法 https://www.jianshu.com/p/735cf71aae7a
3.然后在onStartCommand中创建线程。
2.启动Service:
1.添加两个按钮,获取两个按钮并添加点击事件
2.调用startService方法
3.停止Service:
1.stopSelf
2.stopService
3.Activity与Service通信:
1.媒介就是Service中的onBind()方法
2.基本流程:
1.服务器端:
a.创建一个Service
b.重写onBind方法
c.创建内部类Mybinder,该类继承自Binder类,返回一个IBinder对象,用于和绑定他的组件进行通信
2.客户端:
a.声明Service类的对象
b.创建一个ServiceConnection对象用于获取OnBind方法返回的IBinder对象
c.在onstart方法中调用bindService方法来绑定service
d.在unbindService方法中调用onStop方法来解除绑定
3.实例:模拟双色球彩票的随机选号器:Service2 这里使用的时Bind Service(绑定Service)
a.布局界面
b.创建Service,实现生成随机的彩票号码
i.创建一个service文件BinderService,创建一个MyBinder内部类,用于获取Service对象和Service状态
ii.返回一个有效的IBinder对象,用于实现Service和绑定它的组件之间进行通信
iii.自定义方法,用于生成随机数
iiii.重写onDestory方法,来销毁Service
c.绑定Service,并获取显示随机的彩票号码
i.定义一个BinderService对象<=>声明一个Service类的对象
ii.创建ServiceConnection对象
iii.在onCreate方法中调用BinderService方法中定义的获取随机数方法,并将结果显示在文本框中
iiii.重写onStart&&onStop方法,让Service和Activity进行绑定
4.IntentService的使用

4.Service的实际应用:
1.实现简单的前台服务
2.实现简单的定时后台线程:比如说定时任务,使用Timer类和Alarm机制,可以在后台下载文件,播放歌曲
5.Service精通-跨进程通信:IBinder是Android给我们提供的一个进程间通信的一个接口,通过继承Binder类来实现进程间通信。
1.流程解析:1.Client调用某个代理接口中的方法时,代理接口的方法会将Client传递的参数打包成Parcel对象;
- 2.然后代理接口把该Parcel对象发送给内核中的Binder driver;
- 3.然后Server会读取Binder Driver中的请求数据,假如是发送给自己的,解包Parcel对象, 处理并将结果返回;
2.IPC跨进程通信(interprocess communication):为了实现跨进程,Android提供了Binder机制,使用的接口语言就是: AIDL(Android Interface Definition Language)
3.传递复杂数据的AIDL Service:Parcelable接口
4.直接通过Binder的onTransact完成跨进程通信

posted @ 2020-07-14 23:19  姜余  阅读(353)  评论(0)    收藏  举报