一、service的用法
1.service的概念
Service是一个可以在后台长时间的操作,默默地为其他应用服务的不提供界面的Android组件。
2、基本使用
(1)启动服务的方法
- startService
- bindService
(2)代码描述
首先新建一个ServiceDemo的java程序并继承于Service,然后在ServiceDemo中重写Service中的方法,代码如下:
“`
public class ServiceDemo extends Service{
@Override
public void onCreate() {
super.onCreate();
Log.i(TAG,"onCreate");
mMediaPlayer = MediaPlayer.create(this,R.raw.faded);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG,"onStartCommand");
mMediaPlayer.start();
return START_NOT_STICKY;
}
@Override
public void onDestroy() {
mMediaPlayer.stop();
super.onDestroy();
Log.i(TAG,"onDestroy");
}
public class LocalBinder extends Binder{
MusicService getService(){
return MusicService.this;
}
}
}
在程序中,主要是重写onCreate、onStartCommand和onDestroy方法,然后在这其中添加相应的逻辑代码。
(3)Service的生命周期
通过这个图可以看到,两种启动service的方式以及他们的生命周期,bind service的不同之处在于当绑定的组件销毁后,对应的service也就被kill了。service的声明周期相比与activity的简单了许多,只要好好理解两种启动service方式的异同就行。
关于生命周期,比较简单的流程图如下:
(4)另一个service–IntetService
IntentService使用队列的方式将请求的Intent加入队列,然后开启一个worker thread(线程)来处理队列中的Intent,对于异步的startService请求,IntentService会处理完成一个之后再处理第二个,每一个请求都会在一个单独的worker thread中处理,不会阻塞应用程序的主线程,这里就给我们提供了一个思路,如果有耗时的操作与其在Service里面开启新线程还不如使用IntentService来处理耗时操作。而在一般的继承Service里面如果要进行耗时操作就必须另开线程,但是使用IntentService就可以直接在里面进行耗时操作,因为默认实现了一个worker thread。对于异步的startService请求,IntentService会处理完成一个之后再处理第二个。
二、BroadcastReceiver
1、概述
广播接收者( BroadcastReceiver )用于接收广播 Intent ,广播 Intent 的发送是通过调用 Context.sendBroadcast() 、 Context.sendOrderedBroadcast() 来实现的。通常一个广播 Intent 可以被订阅了此 Intent 的多个广播接收者所接收。
2、两者注册方式
第一种——动态注册:
public class MyBroadcastReceiver extends BroadcastReceiver {
// action 名称
String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED" ;
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals( SMS_RECEIVED )) {
// 相关处理 : 地域变换、电量不足、来电来信;
}
}
}
第二种——系统注册:
< receiver android:name = “.MyBroadcastReceiver” >
< intent-filter android:priority = “1000” >
< action android:name = ” android.provider.Telephony.SMS_RECEIVED” />
当然了需要权限 :
< uses-permission android:name = “android.permission.RECEIVE_SMS” />
< uses-permission android:name = “android.permission.SEND_SMS” />
三、WebView
1、概述
WebView(网络视图)能加载显示网页,可以将其视为一个浏览器,它使用了WebKit渲染引擎加载显示网页。
2、使用步骤
(1)在要Activity中实例化WebView组件:WebView webView = new WebView(this);
(2)调用WebView的loadUrl()方法,设置WevView要显示的网页:
互联网用:webView.loadUrl(“http://www.baidu.com“);
本地文件用:webView.loadUrl(“file:///android_asset/XX.html”); 本地文件存放在:assets 文件中
(3)调用Activity的setContentView( )方法来显示网页视图
(4)用WebView点链接看了很多页以后为了让WebView支持回退功能,需要覆盖覆盖Activity类的onKeyDown()方法,如果不做任何处理,点击系统回退剪键,整个浏览器会调用finish()而结束自身,而不是回退到上一页面
(5)需要在AndroidManifest.xml文件中添加权限,否则会出现Web page not available错误。
<uses-permission android:name="android.permission.INTERNET" />
3、方法重写
(1)Url覆盖
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//是不是重新加载(拦截界面)
//404页面
if(url.contains("404")){
view.loadUrl("http://www.zhihu.com");
}
return super.shouldOverrideUrlLoading(view, url);
}
(2)设置loading界面
public void onPageStarted(WebView view, String url, Bitmap favicon) {
//页面开始加载,可以设置其loading界面
super.onPageStarted(view, url, favicon);
}
(3)关闭loading
public void onPageFinished(WebView view, String url) {
//页面加载结束,关闭loading界面
super.onPageFinished(view, url);
}
(4)Url替换
public void onLoadResource(WebView view, String url) {
//url替换,为了节省流量,盗用人家的logo
if(url.contains("logo.img")){
}
(5)网页请求响应
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
//拦截请求 ,url是打开一个连接 而请求是客户端发送信息给服务器
//hybrid离线网页
return super.shouldInterceptRequest(view, request);
}
由于webview中有很多的重写方法,所以上面的知识其中的一部分,更多的还需要自己去查找Webview的源码。
四、Widget
1、概念
widget就是桌面部件,是android中独有的功能。
2、注册
<receiver android:name=".MusicWidgetProvider">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@layout/widget_setting"/>
</receiver>
3、编写代码,代码也是继续于AppWidgetProvider,一般情况下,会重现下面的几种方法:
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
pushUpdate(context,appWidgetManager,"",false);
}
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
super.onDeleted(context, appWidgetIds);
}
@Override
public void onEnabled(Context context) {
super.onEnabled(context);
}
@Override
public void onDisabled(Context context) {
super.onDisabled(context);
}
五、总结
本周学习的内容比较多,也比较的有趣,可以做出很多有趣的Demo,所以需要好好的练习,努力吧!