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

一、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,所以需要好好的练习,努力吧!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值