Android学习第四周_服务、广播和酷特性

来源:互联网 发布:地摊叫卖录音软件 编辑:程序博客网 时间:2024/05/22 14:39

一、service的用法

1.service的概念
Service是一个可以在后台长时间的操作,默默地为其他应用服务的不提供界面的Android组件。
2、基本使用
(1)启动服务的方法

  • startService
  • bindService

(2)代码描述
首先新建一个ServiceDemo的java程序并继承于Service,然后在ServiceDemo中重写Service中的方法,代码如下:

“`
public class ServiceDemo extends Service{

@Overridepublic void onCreate() {    super.onCreate();    Log.i(TAG,"onCreate");    mMediaPlayer = MediaPlayer.create(this,R.raw.faded);}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {    Log.i(TAG,"onStartCommand");    mMediaPlayer.start();    return START_NOT_STICKY;}@Overridepublic 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);}@Overridepublic void onDeleted(Context context, int[] appWidgetIds) {    super.onDeleted(context, appWidgetIds);}@Overridepublic void onEnabled(Context context) {    super.onEnabled(context);}@Overridepublic void onDisabled(Context context) {    super.onDisabled(context);}

五、总结

本周学习的内容比较多,也比较的有趣,可以做出很多有趣的Demo,所以需要好好的练习,努力吧!

0 0
原创粉丝点击