Android 服务入门
前言:硬着头皮把数据库SQLite看完了,接下来就是android服务了,因为自己本身就是菜鸟,所以呢,也只是做做笔记,技术上的东西就别指望我了。
1.什么是服务呢?举个例子,百度地图,美团外卖,OFO,可以获取你的位置,就提供了位置服务,通知服务基本上每个APP都会有。再举个例子,你开启一个网易云在后台运行,你希望切换到另外一个应用依旧可以听到音乐,这也是服务。
2.服务是没有用户界面的,它是背后默默为人民服务的。只要运行了服务,你就可以放手地去做其他事情了。
3.有两种类型的服务,-----Start services-----启动服务-----从互联网下载一个大文件,-----Bound services-----绑定服务-----汽车里程表。
4.先说一下Start Services,代码中用extends Service类或者extends IntentService类 创建一个服务。顾名思义,前者提供了基本的服务功能,后者还可以和意图Intent挂钩。新建服务时,最好通过File-----New-----Service-----创建新的IntentService-----服务命名自定义。比如啊,创建一个IntentService,服务运行在onHandleIntent这个方法中,是复写的方法。
5.继续IntentService,再建立一个活动,方便调用服务。主要业务逻辑都在onHandlerIntent中进行,这里用了一个synchronized(this){wait(10000)}内部方法,现学现卖一下,意思就是同步。这里wait(10000)和时间挂钩了,等待10s,所以肯定不会那么简单,总之知道怎么用就行了。
6.服务要在AndroidManifest.xml进行声明。与Activity同一级,<service android:name=.服务名 android:exported="false"></> 那exported是什么意思呢,就是告诉Android,这个服务可以有其他应用使用,false表示这个服务只能在当前应用中使用。
7.活动怎么调用服务呢,在主布局中增加一个按钮,单击按钮调用活动的onClick方法。在方法中 Intent intent=new Intent(this,服务名.class)-----intent.putExtra(字符串,意图文本)-----startService(intent),是不是超像调用活动,也许啊,就是那些谷歌开发人员懒得重新建一个服务的调用,就直接在原有的基础上多写一个构造函数吧。
8.如何和主线程挂钩呢,这里服务也为我们提供了一个方法,onStartCommand-----在每次启动意图服务时,都会调用这个方法,比onHandleIntent方法还要快。所以呢,在onStartCommand创建一个处理消息的Handler就可以向主线程传递消息了。昨天也写了一篇博客,Handler必须要定义在主线程中,他就是主线程定义的一个使者,为了监督子线程的工作情况的。
9.服务中的用一个Toast访问屏幕咋办呢?有了handler之后就方便很多了,直接handler.post复写一个run方法,再Toast就可以了 吗?可是服务中的上下文是无法访问屏幕的,那咋办呢?getApplicationContext()不就可以了嘛!
10.Toast个人感觉用户体验并不是特别好,所以这里要多改进改进,试着用别的方法来替换Toast()方法。就用通知吧,一般应用都会有的,其实也很烦,但是也要学啊。-----主要方法就是,在服务中创建一个NotificationManager对象,用来访问Android的通知服务的。
11.怎么在服务中创建一个通知呢
Notification notification=new Notification.Builder(this).多个set.build() 即可。set什么东西呢?比如啊,通知图标,标题,文本,声音,通知个数,优先级,如果不会-----就在goole或者baidu上搜索关键字-----使用通知生成器创建通知。
12.当你点击一个通知时,你想跳到活动中去咋办呢?这就有点小复杂了。
(1)创建一个显示意图,就和之前活动跳转一样。
(2)将这个意图传递到TaskStackBuilder -----它允许访问后退按钮使用的活动历史-----就是保证活动启动时后退按钮可以正常工作而已-----不要想得太复杂了。
(3)从TaskStackBuilder得到挂起意图 用 PendingIntent 接收stackBuilder对象的getPendingIntent()函数。里面有两个参数,一个是标志,一个是挂起意图的行为。
(4)向通知增加意图 -----notification.setContentIntent(pendingIntent)
(5)用通俗的话来讲,就是-----挂起意图被玩来玩去-----先从服务中创建-----在被TaskStackBuilder玩弄是非-----在从getPendingIntent中得到-----最后回到通知的怀抱。
13.回到通知的怀抱之后,就要发起总攻了,那就是Android的通知服务-----完成在设备上显示的大业。首先要有一个旗号,才能鼓舞更多的人,就是通知的ID-----其次直接getSystenService()来获得访问权限-----通过这个“通知经理”来创建通知。这样,所有的通知基本上都通过这个经理组织起来了。
14.简单讲一下整个过程,首先呢,MainActivity通过一个意图-----联系到MessageService服务(类似于一个活动一样传递即可)-----执行服务中的代码,主要是修改onHandleIntent,顾名思义就是消息处理中心-----然后里面随便写一个方法-----方法实现了将普通意图升级成挂起意图-----挂起意图升级为通知-----通知最后告诉Android先生。
15.然后就是绑定服务呢,一听这个名字,就是牢牢绑住用户-----所以更具有交互性-----类似于汽车的里程表。它怎么工作呢?
16.主要有以下几个步骤-----如监听用户行走路径-----用到了位置服务
(1)定义一个OdometerBinder-----只要继承Binder即可。利用这个对象可以把活动连接到OdometerService 。
(2)创建一个LocationListener,向Android的位置服务注册这个监听器-----计算已经走过的里程数
(3)创建一个公共getMiles()方法-----活动可以使用这个方法得到走过的里程数。
17.怎么绑定呢?主活动创建一个ServiceConnection对象-----活动通过这个连接将一个意图传递到服务-----绑定服务创建一个Binder对象-----服务通过连接发回Binder-----活动接收到Binder对象后,取出Service对象,使用这个服务。
18.用通俗的话讲,就是ServiceConnection作为一个中介代理,左边是MainActivity,右边是Service,总之,ServiceConnection就像一座桥一样,连通了这条路,缺一不可。
19.在这条路中来回穿梭的车子,就是Binder了。活动使用OdometerBinder类部类来获得OdometerService的一个引用。
20.Service类提供了4大天王,onCreate是创建服务,onStartCommand是第一次启动,onBind是绑定到服务,onDestroy是撤销服务。
21.所以说,如何得到设备的位置呢?just a LocationListener-----它有four个override-----onLocationChanged-----onProviderDisabled-----onProviderEnabled-----onStatusChanged
22.然后是注册监听器,基本使用这些高档的方法,都要问一下Android君,我可以用一下位置服务吗?安卓君派一个经理-----这里是LocationManager-----帮助他完成大业。
23.经理是可以轻松得到信息的,活动不知道啊,那怎么办呢?创建一个方法来访问服务嘛-----可以提供更加精准的人性化的数据,如提供几千米,几英里-----国人一般用千米。
24.简单总结一下,首先是一个自定义服务继承Service-----里面有一个自定义Binder继承Binder-----复写一个onBind将活动绑定到服务-----复写一个onCreate方法用来创建服务是建立位置监听器-----onCreate里面的监听器有4个方法要复写-----最重要的是onLocationChanged-----onCreate最后要向位置Android君请求,之后向位置服务注册位置监听器-----最后自定义一个方法在活动中得到数据,如转换公里数。
25.这里涉及到了GPS,安卓君对这个东西管理得比较严格,所以在AndroidManifest.xml中要声明一下权限-----否则会崩溃哒。其次服务也要声明,任何服务都要声明,每个服务都会有一个名字,android:exported-----只有这个应用才使用这个服务,android:enabled-----应用能否使用这个服务。
26.紧接着就是用测试了,用一个Main活动来处理。将她绑定到服务-----更新文本视图。
27.怎么绑定呢?just a ServiceConnection-----它有两个方法-----onServiceConnected用来建立与服务的连接-----onServiceConnected用来失去服务连接。
28.Main中的私有成员,我称私有成员为-----仅仅是从别人那里得到暂用一下-----别人那得到是将别的东西赋给它-----暂用一下是得到之后肯定要用什么方法。
29.Main活动启动时要绑定到服务,怎么绑定呢?just in onStart---复写Main中的onStart方法-----创建一个显示意图,指定你要绑定的服务-----然后活动提供了一个重要的方法-----bindService来将意图和连接挂钩。
30.有了onStart方法,当然不能少了onStop方法了,just 啊unbindService方法来解除服务绑定。
31.然后就是布局要显示什么东西了。注意要用到视图更新,就要用到handler来处理,handler可以分两部分,也可以简写,前面我也写了一篇博客-----线程+handler+Thread,这里提供了一个更加简单的方法,handler.post(new Runnable(){.....}),我在想这个创造这个函数的人是不是太懒了,感觉只适合牛人用。
32.整理一下思路,首先在Main中建立两个私有成员-----自定义服务类-----boolean是否绑定到服务。然后是定义一个ServiceConnection-----用来连接服务时得到一个自定义服务的引用-----复写了onServiceConnected-----复写了onServiceDisConnected 。然后是一个onCreate函数-----里面加载布局和视图更新的函数。 然后是复写onStart方法-----驱动活动是绑定服务-----用了一个bindService方法(活动本身有的)。 然后是复写onStop方法-----活动停止是解除服务绑定。 注意点就是视图更新的函数用了handler来处理。
33.整个服务就看的差不多了,目的很简单,就只知道整个流程,用的时候会用-----现在时间紧迫,不求精通-----以后有空再深入研究一下。
早安!2017/7/11 7:50
Android 服务入门的更多相关文章
- Bmob移动后端云服务平台--Android从零開始--(二)android高速入门
Bmob移动后端云服务平台--Android从零開始--(二)android高速入门 上一篇博文我们简介何为Bmob移动后端服务平台,以及其相关功能和优势. 本文将利用Bmob高速实现简单样例,进一步 ...
- [译]:Xamarin.Android开发入门——Hello,Android Multiscreen深入理解
原文链接:Hello, Android Multiscreen_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android Multiscreen深入理解. 本 ...
- Android开发入门要点记录:四大组件
cocos2dx跨平台开发中需要了解android开发,昨天快速的浏览了一本Android开发入门教程,因为之前也似懂非懂的写过Activity,Intent,XML文件,还有里面许多控件甚至编程思想 ...
- .Net Core微服务入门全纪录(六)——EventBus-事件总线
前言 上一篇[.Net Core微服务入门全纪录(五)--Ocelot-API网关(下)]中已经完成了Ocelot + Consul的搭建,这一篇简单说一下EventBus. EventBus-事件总 ...
- [译]:Xamarin.Android开发入门——Hello,Android深入理解
返回索引目录 原文链接:Hello, Android_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android深入理解 本部分介绍利用Xamarin开发And ...
- [译]:Xamarin.Android开发入门——Hello,Android快速上手
返回索引目录 原文链接:Hello, Android_Quickstart. 译文链接:Xamarin.Android开发入门--Hello,Android快速上手 本部分介绍利用Xamarin开发A ...
- Hello, Android 快速入门
Hello, Android Android 开发与 Xamarin 简介 在这两节指南中,我们将 (使用 Xamarin Studio或 Visual Studio)建立我们的第一个 Xamarin ...
- Android工程师入门(二)——不忙不累怎么睡。。
安卓开发迫在眉睫,这周入个门吧! Android工程师入门(二) 四.在界面中显示图片 ImageView 是显示图片的一个控件. --属性 src——内容图片: background——背景图片/背 ...
- [电子书] 《Android编程入门很简单》
<Android编程入门很简单>是一本与众不同的Android学习读物,是一本化繁为简,把抽象问题具体化,把复杂问题简单化的书.本书避免出现云山雾罩.晦涩难懂的讲解,代之以轻松活泼.由浅入 ...
随机推荐
- Mavlink消息包解析
Byte Index 字节索引 Content 内容 Value 值 Explanation 说明 0 包起始标志 v1.0: 0xFE (v0.9: 0x55) 指示新消息帧的开始.在v1.0版本中 ...
- (已解决)Arduino mega2560 R3插在电脑上没有反应
OK,话不多说.网上找了一些资料,感觉都说的不够清晰.自己琢磨了下,有了一个简单粗暴的方法. 步骤1:插上Arduino mega2560板子.没有反应. 步骤2:我的电脑-管理-设备管 ...
- 【iOS学习笔记】改变状态栏字体颜色
Step1. info.plist中设置UIViewControllerBasedStatusBarAppearance为NO Step2. AppDelegate.m中添加 - (BOOL)appl ...
- 【MFC】MFCMenuButton 的用法
背景:因为对话框界面上的空间有限,为了节省空间,我决定采用一个MFCMenuButton用来实现同一类按钮事件.本来我打算设置两个按钮:“单个删除文件”和“清空所有文件”两个按钮,但是空间太小,而且这 ...
- 使用Loadrunner监控Windows资源
为了区分把装有loadrunner的机器称作A,被监控资源的服务器(windows)称作B 1.确保B机器Administrator账户是可使用状态:右键计算机→ 管理→ 本地用户和组→ 用户,其中A ...
- JS事件阻止冒泡的写法
$("body").on("click", "#id", function (ev) { ev = ev || event;要写的逻辑代码 ...
- 【BZOJ3940】[USACO2015 Feb] Censoring (AC自动机的小应用)
点此看题面 大致题意: 给你一个文本串和\(N\)个模式串,要你将每一个模式串从文本串中删去.(此题是[BZOJ3942][Usaco2015 Feb]Censoring的升级版) \(AC\)自动机 ...
- 分布式版本控制系统git
最近看到这篇文章,简洁易懂,特摘抄至https://www.cnblogs.com/bgwhite/p/9403233.html 供大家提供参考. git可以说是世界上最先进的版本控制系统,大多语句的 ...
- python_35_进度条
import sys for i in range(50): sys.stdout.write("+")#此命令不会像print语句执行一次,换行一次\ sys.stdout.fl ...
- Python-Boolean operation
一.布尔运算符 1.x and y: if x is false, then x, else y 2.x or y: if x is false, then y, else x 3.not x: if ...