《Android高级开发》课程总结及知识点复习

简单的总结一下这学期的Android学习内容:

Android样式

Android的样式一般定义在项目res/values/styles.xml中
样式的使用:
<Button style="@style/mystyle">

Android拍照:

  • 使用系统相机:原理是通过本APP来调用另一个APP(相机)来拍照,通过Intent来完成 。
//1.启动系统相机:
Intent  intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent);
//2.在回调方法中的到拍照图片
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      super.onActivityResult(requestCode, resultCode, data);
      Bitmap bp = (Bitmap) data.getExtras().get("data");
      iv.setImageBitmap(bp);
   }
  • 使用Camera API
    必须声明一下两个权限:
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

创建Camera:

Camera obj Camera.open();

takePicture()方法解释:

takePicture(Camera.ShutterCallback, Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback)
//第一个是块门按下的回调。后三个接口分别对应三分图像数据,分别是原始图像,压缩图像,JPG图像,通常只关心JPG图像数据,此时前两个接口参数可以直接传null

位置服务

  • Intent与PendingIntent:
  • Intent:Intent代表一个意图,它描述了想要启动一个Activity、Broadcast或Service的意图
    通过startActivity、startService或sendBroadcast方法启动.
  • PendingIntent:主要用于延迟执行的任务,是对Intent的包装。由其他APP间接指挥本APP来执行Intent,PendingIntent的执行者是原APP。
  • PendingIntent使用场景:
  • 发送短消息
sendTextMessage(destinationAddress, scAddress, text, sentIntent, deliveryIntent);//在“短信发送成功”和“对方收到此短信”才会激活 sentIntent和deliveryIntent这两个Intent。这也相当于是延迟执行了Intent。
  • 通知:
notification.setLatestEventInfo(this, “标题”, “通知的内容", contentIntent);
  • 定时任务:
setRepeating (int type, long triggerAtMillis, long intervalMillis, PendingIntent operation)
  • 创建PendingIntent:
//PendingIntent类有三个静态方法:
getActivity(Context c,  int requestCode, Intent intent, int flags)
getService(Context c,  int requestCode, Intent intent, int flags)
getBroadcast(Context c,  int requestCode, Intent intent, int flags)
  • 位置服务:
    Android平台支持提供位置服务的API,可以利用GPS(Global Positioning System,全球定位系统)和Network Location Provider(网络位置提供器)来获得用户的位置。
  • 核心API:LocationManager
    它是访问Android位置的入口,和其他服务一样,不能直接创建,而是通过Context的getSystemService()来获得对象实例
LocationManager  lm = getSystemService(Context.LOCATION_SERVICE);
  • 重要方法:
    requestLocationUpdates(),周期性的获取定位信息。
    getLastKnowLocation:获取最近一次已知的定位信息。
  • 当位置发生改变,Android会用两种方式来通知APP:(任意选择一种实现)
  • LocationListener:实现该接口及其定义的回调方法:onLocationChanged
    优点:简单
    缺点:若当前APP退出,则listener被destroy,无法再收到位置更新通知
  • PendingIntent:包装一个Intent(通常是广播Intent),配合一个BroadcastReceiver来实现
    优点:即使当前APP退出,也能收到位置更新通知(这是PendingIntent的特性)
    缺点:实现较复杂

Intent

  • 显式Intent:
    通过指定Intent组件名称来实现的,它一般用在知道目标组件名称的前提下,一般是在相同的应用程序内部实现的。
public  void  onClick(View  v)  {
    Intent  I  =  new  Intent(QuizActivity.this,  CheatActivity.class);
    boolean  answer  =  true;
    I.putExtra(”myanswer”,  answer);
    startActivity(i);
}
//CheatActivity.java
    public  void  onCreate(Bundle  b)  {
    super.onCreate(b);
    mAnswer  =  getIntent().getBooleanExtra(“myanswer”,  false);
}
  • 隐式Intent:
    通过Intent Filter来实现的,它一般用在没有明确指出目标组件名称的前提下,一般是用于在不同应用程序之间。(隐式Intent告诉操作系统我们希望执行的功能,但并不清楚那个应用程序完成该功能,有操作系统或用户决定)
    例如:点击分享按钮,会弹出一系列可共享的APP供用户选择
public  void  onClick(View  v)  {
    Intent  i  =  new  Intent(Intent.ACTION_SEND);
    startActivity(i);
}
  • 系统Launcher实现原理:
    所有APP的主Activity都具有一个特殊得action和category
<intent-filter>
    <action  android:name=“android.intent.action.MAIN”  />
    <category  android:name=“android.intent.category.LAUNCHER”  />
</intent-filter>

想要作为系统的Launcher(或者叫做桌面,主屏)需要修改应用配置
当用户按下Home键,则会出现让用户选择Launcher的界面:

<intent-filter>
    <action  android:name=“android.intent.action.MAIN”  />
    <category  android:name=“android.intent.category.LAUNCHER”  />
    <category  android:name=“android.intent.category.HOME”  />
    <category  android:name=“android.intent.category.DEFAULT”  />
</intent-filter>

后台服务(background service):

  • 全局定时器AlarmManager:提供对系统闹钟服务的访问接口(系统服务)
    当闹钟响起,实际上是系统发出了为这个闹钟注册的广播,会自动开启目标应用

在指定时间后执行一次任务:

set(int type, long  triggerAtMillis, PendingIntent operation)
  • 参数1:时间类型,可选值:
    RTC,全局时间,但不会唤醒设备
    RTC_WAKEUP,全局时间,会唤醒设备
  • 参数2:开始时间,单位是毫秒。
    若开始时间是过去的时间,则立即执行
  • 参数3:待执行任务:其实就是Intent
    注:若同一任务被设定两次,则后一次会代替前一个任务,前一个任务失效

在指定重复周期内不断执行:

setRepeating (int type, long triggerAtMillis, long intervalMillis, PendingIntent operation)

参数1:时间类型,可选RTC及RTC_WAKEUP
参数2:开始时间,单位毫秒
参数3:时间间隔,单位毫秒。每隔这么长时间就执行一次
参数4:执行的任务

  • intent不能直接传入AlarmManager,必须经过PendingIntent包装一下。
Intent i = new Intent(context, MyActivity.class);
PendingIntent p = PendingIntent.getActivity(context, 0, i, 0);
  • 后台服务:
    类似于Activity,但没有界面
    继承自IntentService
    可接收Intent,以便外界调用
    必须在AndroidManifest.xml中注册
public  class  PollService  extends  IntentService  {
  @Override
  protected  void  onHandleIntent(Intent  intent)  {
     //处理具体任务
     Log.i(TAG,  "开始执行任务:"  +  intent);
  }
}

后台服务默认采用队列机制,避免并发问题

广播接收器(broadcast receiver)

Android提供的系统服务
允许你的应用接收系统或其他应用的事件(即得到通知)
当一个事件发生时,所有注册的接收器(receiver)都会被通知
例如:一个应用注册了接收ACTION_BOOT_COMPLETED事件,那么当Android系统启动完成时就会通知它。(即常见的自动启动应用)

  • 当事件发生时,一个BroadcastReceiver的onReceive()方法将会被调用。该方法结束,整个receiver对象也将会被清理掉
  • 一般不应该在onReceive()方法中执行太耗时的任务,避免拖慢系统响应。
  • 如何实现广播接收器:
  1. 继承BroadcastReceiver实现其中的onReceive()方法
  2. 登记注册:
  • 静态注册,通过AndroidManifest.xml
    <application>节点下添加<receiver>节点来注册。
  • 动态注册,调用Context.registerReceiver()方法。必须主动注销
    自定义权限必须制定android:protectionLevel属性值:
    normal,dangerous,signature,signatureOrSystem
  • 有序广播(Ordered Broadcast)
    有序广播比较特殊,它每次只发送到优先级较高的接收者那里,然后由优先级高的接受者再传播到优先级低的接收者那里,优先级高的接收者有能力终止这个广播
  • 设置有序广播的优先级:
<intent-filter android:priority="998" >

网页浏览

  • 系统浏览器编程:
    优点:无需特殊权限,简单。
    缺点:自定义选项少,控制力度小
Uri uri = Uri.parse(“http://www.google.com”);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
  • 使用WebView:
    可以在应用中显示一个网页,是系统自带的一个组件。但不是一个功能完整的浏览器:没有前进,后退,没有网址框
    使用步骤:
  1. 首先将WebView添加到layout文件中
  2. 在activity中获得WebView实例
    开启JavaScript
    加载指定网页
mWebView = (WebView)findViewById(R.id.activity_main_webview);
WebSettings = webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
mWebView.loadUrl("http:www.//baidu.com");
  1. 添加网络使用权限:在<manifest>节点中
<uses-permission android:name="android.permission.INTERNET" />
  • 绑定JavaScript与Android:

步骤:

  • 建立一个类,其中包含希望JavaScript调用的方法
    从Android 17版本(4.2)开始,所有可被调用的方法必须用@JavascriptInterface注解
  • 调用WebView的addJavascriptInterface(),将之前类的实例传入


  • 在JavaScript中即可调用自己所定义的Java方法


其他问题:

  • 处理网页跳转:覆盖shouldOverrideUrlLoading(WebView view, String url)方法。若返回true,则表示让当前APP去处理即将打开的网址(默认是调用系统浏览器)。若返回false,则表示让WebView来处理该网址(在当前APP打开)
  • 处理网页浏览历史:
    覆盖activity的onKeyDown()方法来监测用户按键并处理
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容