简单的总结一下这学期的Android学习内容:
Android样式
Android的样式一般定义在项目res/values/styles.xml中
样式的使用:
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
必须声明一下两个权限:
创建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
想要作为系统的Launcher(或者叫做桌面,主屏)需要修改应用配置
当用户按下Home键,则会出现让用户选择Launcher的界面:
后台服务(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()方法中执行太耗时的任务,避免拖慢系统响应。
- 如何实现广播接收器:
- 继承BroadcastReceiver实现其中的onReceive()方法
- 登记注册:
- 静态注册,通过AndroidManifest.xml
节点下添加
节点来注册。 - 动态注册,调用Context.registerReceiver()方法。必须主动注销
自定义权限必须制定android:protectionLevel属性值:
normal,dangerous,signature,signatureOrSystem - 有序广播(Ordered Broadcast)
有序广播比较特殊,它每次只发送到优先级较高的接收者那里,然后由优先级高的接受者再传播到优先级低的接收者那里,优先级高的接收者有能力终止这个广播 - 设置有序广播的优先级:
网页浏览
- 系统浏览器编程:
优点:无需特殊权限,简单。
缺点:自定义选项少,控制力度小
Uri uri = Uri.parse(“http://www.google.com”);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
- 使用WebView:
可以在应用中显示一个网页,是系统自带的一个组件。但不是一个功能完整的浏览器:没有前进,后退,没有网址框
使用步骤:
- 首先将WebView添加到layout文件中
- 在activity中获得WebView实例
开启JavaScript
加载指定网页
mWebView = (WebView)findViewById(R.id.activity_main_webview);
WebSettings = webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
mWebView.loadUrl("http:www.//baidu.com");
- 添加网络使用权限:在
节点中
- 绑定JavaScript与Android:
步骤:
- 建立一个类,其中包含希望JavaScript调用的方法
从Android 17版本(4.2)开始,所有可被调用的方法必须用@JavascriptInterface
注解
-
调用WebView的addJavascriptInterface(),将之前类的实例传入
-
在JavaScript中即可调用自己所定义的Java方法
其他问题:
- 处理网页跳转:覆盖
shouldOverrideUrlLoading(WebView view, String url)
方法。若返回true,则表示让当前APP去处理即将打开的网址(默认是调用系统浏览器)。若返回false,则表示让WebView来处理该网址(在当前APP打开) - 处理网页浏览历史:
覆盖activity的onKeyDown()
方法来监测用户按键并处理