在大部分地方,比如书本或者学校和培训机构,教学Android的方式都基本类似,就是告诉先上原理方法,然后对着代码讲一下。

但是,这往往不是一个很好的方法,为什么?

① 学生要掌握这个方法的用途,只能通过记忆而不是理解

② 当某些原理稍微复杂的时候,通过讲解是不能直接理解的,有时候下课回去了再看也不一定看得明白

③ 对英语文档不够重视,有问题先百度

本鸟自学Android一年,慢慢也学习到了很多的方法,如果你也是一个入门不久但是觉得很多东西都不明白的新手,希望本文对你有帮助。

我觉得要想学好Android有几个重要的难点(注意这里不是四大组件也不是什么框架),就是:英语、文档和Google。

假设我们要写一个后台服务,在一个Activity中要控制这个服务,也就是要执行服务中的方法。当你知道这个问题之后你会怎么去解决它?

我相信有很多人会直接就就翻书本看,或者百度一下看看别人的代码是怎么写的然后复制粘贴完成任务。很多人都是这么解决问题的,为什么?因为在课堂上看到了这些代码,但不一定记住了,所以知道课本或者百度会有答案。

看书本和百度有什么缺点么?

① 百度各种乱入的推广,搜索技术问题会给你培训推广。所以百度的唯一用处基本就是查看自家网络是否正常了。

② 看书本不是不好,但是书本始终是别人的,入门的话看看书本是有好处的,但是当需要解决问题的时候,书本不应该是第一想到的帮手。

③ 直接给出的代码可能不会引起你注意一些细小的地方,很多时候,就是这些细小的地方导致我们卡在某个地方,到时候就只能怪当时没有弄明白了。

在开始编码之前,有几个重要的问题我们要先解决:

① 找到可用的翻墙工具或者VPN,保证自己可以翻墙,因为无论是Google还是SDK升级还是Android Studio升级都需要

② 在SDK Manager中下载最新的API文档,没有这个你都可以不用学Android开发了,如下图:

③ 打开Android Studio的文档提示,在Eclipse中鼠标放在方法名上会有文档提示,在AS中需要手动打开一下,如下图:

④ 准备好你的翻译工具

开始编码:

① 我们都知道,要绑定一个服务,是要通过Context.bindService方法来做到的,如下图

可以看到,这个方法需要三个参数,但是这三个参数有代表什么呢,假设我们都不懂,没关系,我们不要百度,也不用翻书,直接把鼠标放在方法上,我们可以看到关于这个方法的文档,如下所示:

我们可以大致看看这个方法的介绍,明白它有什么用就可以了,比如当我们没有获得绑定服务的权限的时候会抛出异常,方法不能被广播接收者调用等等。这里我们要注意的是Parameters和Returns这两个地方。

Parameters指出了方法需要的参数分别是什么意思,有何要求,对于这个方法需要三个参数分别是Intent、ServiceConnection和flags:

service:一个可以被识别且要连接到的服务意图,意图可以由服务类名实例化或者逻辑描述实例化(使用action或者catagory等等)

conn:用来接收服务启动或者停止的信息,必须要实现

flags:一个配置标记,可以是上面这些值,意思也很明了

Returns指出调用这个方法会返回的值,这里如果绑定成功会返回true,否则返回false

② 意图我们是很容易构建出来的,不外乎写一个类并继承Service,然后通过显式或者隐式调用的方法构建一个Intent对象,这里代码暂时省略

③ 我们可以看到ServiceConnection的文档如下:

可以看到ServiceConnection是一个接口,最后一句表示:跟系统中许多的回调一样,子类的方法都会在主线程被调用,这里我们知道,我们不能给接口new一个对象,传入bindService只能是接口的实现类,那么就需要我们写一个类,来实现这个接口,代码如下:

private class MyServiceConnection implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) { } @Override
public void onServiceDisconnected(ComponentName name) { }
}

我们可以看到这个接口中有两个方法需要我们实现,那么这两个方法有时什么意思呢,我们先看onServiceConnected,文档如下:

可以看到,方法是在服务连接成功的时候回调的,并且回调时会把一个IBinder的子类返回来,在参数中我们也看到了这个信息,文档还提示我们可以通过IBinder来调用服务的方法。

④ 我们回到服务的代码中

public class MyService extends Service {
private static final String TAG = "MyService"; @Nullable
@Override
public IBinder onBind(Intent intent) {
return new MyBinder();
} public void Method(){
Log.d(TAG, "Method() called" + "");
} }

Service类中有一个抽象方法onBind,我们需要实现,并且我们在服务中添加了一个叫做Method的方法,用来表示我们需要在Activity中调用的方法。接下来我们看看onBind的文档:

文档指出,我们在Activity中获得的IBinder是在这个方法中返回的,既然这样,我们就可以尝试在Service中(为什么要在这里?)定义一个IBinder的子类,但是我们发现,IBinder接口中有很多方法需要实现,在文档中我们也看到其实官方不推荐我们之间实现这个接口,而应该继承IBinder的子类Binder:

完成之后,我们直接在onBind方法中返回一个Binder的子类,并且在Binder子类中新建方法calllMethod来调用服务的Method方法,所以整个Service的方法如下:

public class MyService extends Service {
private static final String TAG = "MyService"; public class MyBinder extends Binder{
public void callMethod(){
Method();
}
} @Nullable
@Override
public IBinder onBind(Intent intent) {
return new MyBinder();
} public void Method(){
Log.d(TAG, "Method() called" + "");
} }

⑤ 因为这个时候,Service中的Binder对象已经被回调方法传回了Activity中,所以我们可以在onServiceConnected中获取得到,但是注意获取到的是IBinder类型,我们需要强制类型转换一下:

@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mBinder = (MyService.MyBinder) service;
}

获取到这个Binder之后,我们就可以调用里面的方法了。

官方文档是开发最好的指导,可能你会觉得都是英文很难看懂,看到速度没有百度一下来得爽快,但是要知道,我们掌握的技术如果要等到有中文的时候才能掌握,那你就不应该选择IT行业了。而且如果不刻意锻炼提高自己的英语水平,那你是基本告别GitHub、StackOverflow等等有用的网站了。上面的例子其实并没有提到Google,但是,如果你试过被一个问题弄到崩溃的边缘,但是把问题Google一下之后,发现Stackoverflow中已经有人遇到并且有大神回答了帮了你好一大个忙的时候,你就会明白为什么我不用百度了。其实道理也很简单,Google是全世界开发者共同使用的,而百度,是部分中国开发者才会使用的!

最后说一下这个英语,其实本人英语也不是多好,有时候某些单词还是得靠翻译。但是,只要你开始强迫自己去阅读英语文档,慢慢的你会发现,有时候我们都不知道文档内容的中文意思,但是却明白文档要我们怎么做,这个就是我们需要的最好的状态,不要被母语束缚了,有心学什么都不难。

Android开发学习之路-该怎么学Android(Service和Activity通信为例)的更多相关文章

  1. Android开发学习之路-RecyclerView滑动删除和拖动排序

    Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...

  2. Android开发学习之路--Activity之初体验

    环境也搭建好了,android系统也基本了解了,那么接下来就可以开始学习android开发了,相信这么学下去肯定可以把android开发学习好的,再加上时而再温故下linux下的知识,看看androi ...

  3. Android开发学习之路--Android系统架构初探

    环境搭建好了,最简单的app也运行过了,那么app到底是怎么运行在手机上的,手机又到底怎么能运行这些应用,一堆的电子元器件最后可以运行这么美妙的界面,在此还是需要好好研究研究.这里从芯片及硬件模块-& ...

  4. Android开发学习之路--MAC下Android Studio开发环境搭建

    自从毕业开始到现在还没有系统地学习android应用的开发,之前一直都是做些底层的驱动,以及linux上的c开发.虽然写过几个简单的app,也对android4.0.3的源代码做过部分的分析,也算入门 ...

  5. Android开发学习之路--基于vitamio的视频播放器(二)

      终于把该忙的事情都忙得差不多了,接下来又可以开始good good study,day day up了.在Android开发学习之路–基于vitamio的视频播放器(一)中,主要讲了播放器的界面的 ...

  6. Android开发学习之路--Android Studio cmake编译ffmpeg

      最新的android studio2.2引入了cmake可以很好地实现ndk的编写.这里使用最新的方式,对于以前的android下的ndk编译什么的可以参考之前的文章:Android开发学习之路– ...

  7. Android开发学习之路--网络编程之xml、json

    一般网络数据通过http来get,post,那么其中的数据不可能杂乱无章,比如我要post一段数据,肯定是要有一定的格式,协议的.常用的就是xml和json了.在此先要搭建个简单的服务器吧,首先呢下载 ...

  8. Android开发学习总结——搭建最新版本的Android开发环境

    原文出自:https://www.cnblogs.com/xdp-gacl/p/4322165.html#undefined 最近由于工作中要负责开发一款Android的App,之前都是做JavaWe ...

  9. android开发学习笔记系列(1)-android起航

    前言 在学习安卓的过程中,我觉得非常有必要将自己所学的东西进行整理,因为每每当我知道我应该是如何去实现功能的时候,有许多细节问题我总是会遗漏,因此我也萌生了写一系列博客来描述自己学习的路线,让我的an ...

随机推荐

  1. C#开发中常用方法1------日期计算

    /// <summary>/// 获取指定日期,在为一年中为第几周/// </summary>/// <param name="dt">指定时间 ...

  2. 【iOS Instrument性能优化集】

    iOS Instrument性能优化集 1.UIImage缓存取舍 在项目代码中看到大量使用如下代码: UIImage使用 在Main Thread中发现不同动画场景中Image IO 开销和耗时所占 ...

  3. 《UML大战需求分析》阅读随笔(二)

    在需求方面,我自己大体认为,分为两个部分:客户和软件公司. 客户:提出需求. 软件公司:解决需求. 这就是我所认为的 需求的关系. 就像书中所说的: 软件公司(项目组)始终都是跟着客户的后面追,客户需 ...

  4. BFS_最短路径

    已知若干个城市的地图,求从一个城市到另一个城市的路径,要求路径中经过的城市最少. #include<iostream> #include<cstring> using name ...

  5. JQuery.validate.js 表单验证

    官方网站:http://bassistance.de/jquery-plugins/jquery-plugin-validation/API: http://jquery.bassistance.de ...

  6. 丢手帕问题即约瑟夫问题的PHP解法

    问题描述:n个人排成一圈.从某个人开始,依次报数,数到m的人被杀死.下一个人重新从1开始报数,数到m的人被杀死.直到剩下最后一个人. 解决思路:从数学角度去看,每一次报数决定谁去死是一个n.m的求余数 ...

  7. React Native MAC上环境搭建笔记

    今天花了一点时间搭建了一下react native环境,在这个过程中遇到了一些问题,处理并总结一下,年纪大了记性不好,只能多写写...真是岁月不饶人啊! 第一步:安装最新版本的Xcode工具 第二步: ...

  8. 【BZOJ1700】[Usaco2007 Jan]Problem Solving 解题 动态规划

    [BZOJ1700][Usaco2007 Jan]Problem Solving 解题 Description 过去的日子里,农夫John的牛没有任何题目. 可是现在他们有题目,有很多的题目. 精确地 ...

  9. WP8解析XML格式文件

    DOTA2 WebAPI请求返回的格式有两种,一种是XML,一种是JSON,默认是返回JSON格式,如果要返回XML格式的话,需要在加上format=xml. 这里举一个简单的解析XML格式的例子(更 ...

  10. mysql中生产表格多列统计问题

    for Example: select date_format(date,'%Y-%m-%d') as day, count(case when xinghao='a' then 1 end) as  ...