安卓第四周Service,Broadcast Receiver,Widget,Webview

无聊的前言:
  • 又是艰苦卓绝的一周,我这种人又想放弃了,真是无语。之前看了视频还以为挺简单,周五也做了一点点,自信满满留到周日下午完成。于是周六和朋友出去,聊了国家和民族在社会主义初级阶段的矛盾(6不6),以及自身的发展问题,有点无奈,感觉自己人生选择变少了,眼界窄的可怕。。。然后周日下午开始写作业,结果各种BUG。于是又想放弃,结果老师一眼看出缺个非空判断语句,这种问题也是能搞死人的。。。下周晚上不能玩了,要看文档了

Service:服务,可以实现比如音乐播放之类的后台功能

  • 首先继承
    public class MusicService extends Service

  • 在ManiFest.xml中添加申明
    <service android:name=".MusicService"/>

  • 接着在res中添加raw文件夹,用于存放音频文件(英文小写)

  • 服务启动方法有二:

  • 1.start启动方式
    1

       @Override
       public void onCreate() {
       super.onCreate();
       mMediaPlayer = MediaPlayer.create(this,R.raw.libai);
       }

    2

       @Override
       public int onStartCommand(Intent intent, int flags, int startId) {
           mMediaPlayer.start();
           return START_NOT_STICKY;
       }

    3

       @Override
       public void onDestroy() {
       mMediaPlayer.stop();
       super.onDestroy();
       }
    
  • 大致生命周期:onCreate()->onStartCommand->onDestroy()

  • 2.bind方式(比作桥梁)
    1.Service中新建内部类,返回MusicService给Activity中的ServiceConnection

       public class LocalBinder extends Binder {
       MusicService getService(){
           return MusicService.this;
       }
       }

    2.暂存Binder中,Binder实现了IBinder接口,故实例化IBinder对象来绑定service

       private IBinder mIBinder = new LocalBinder();

    3.在Service类的默认方法中得到IBinder对象

       @Nullable
       @Override
       public IBinder onBind(Intent intent) {
           return mIBinder;
       }

    4.此处传入一个mServiceConnection

       bindService(new Intent(MainActivity.this, MusicService.class), mServiceConnection, BIND_AUTO_CREATE);

    5.写一个连接带两个方法(有点绕)

       private ServiceConnection mServiceConnection = new ServiceConnection() {
       private MusicService mMusicService;
       @Override
       public void onServiceConnected(ComponentName name, IBinder service) {
           MusicService.LocalBinder localBinder= (MusicService.LocalBinder) service;
           mMusicService = localBinder.getService();
       }
       @Override
       public void onServiceDisconnected(ComponentName name) {
       }
       };

    6.最后unbindService

       unbindService(mServiceConnection);
    

Broadcast Receiver广播接收器

1、四大组件之一:广播(通知消息)接收器 –要想到在Manifest中注册
2、系统使用了很多广播:通知时间改变(闹钟才会响)、电池电量变低、拍摄了照片、改变了语言
3、没有用户界面。
4、只负责向所有在Manifest里的注册者发送广播,需要这个广播的人去接收它。

  • BroadcastReceiver的两种注册方式:

  • 1.静态注册

        <receiver android:name=".TestBroadcastReceiver">
           <intent-filter>
               <action android:name="com.example.test.broadcast"/>
           </intent-filter>
        </receiver>
  • 2.动态注册,在onStart方法中注册,在onStop方法中反注册

    @Override
    protected void onStart() {
       super.onStart();
    
       /* 动态注册广播*/
       //根据action里的android:name过滤广播。
       IntentFilter intentFilter = new IntentFilter();
       intentFilter.addAction(COM_EXAMPLE_TEST_BROADCAST);
       registerReceiver(mTestBroadcastReceiver, intentFilter);
     }
    
     @Override
     protected void onStop() {
        super.onStop();
       unregisterReceiver(mTestBroadcastReceiver);
     }
  • 两者的区别:静态注册的广播一直有效,动态注册的广播需要反注册掉,不然注册在内存里,会不断的消耗内存,所以常用动态注册。

如何接受广播 onReceive方法
  • MainActivity类

       @Override
       public void onClick(View view) {
           /* 发送广播 */
           Intent intent = new Intent(MainActivity.this,TestBroadcastReceiver.class);
           //只发给action为COM_EXAMPLE_TEST_BROADCAST
           intent.setAction(COM_EXAMPLE_TEST_BROADCAST);
           intent.putExtra("toast", "this is a toast of broadcast");
           sendBroadcast(intent);
       }
  • BroadcastReceiver类

       public class TestBroadcastReceiver extends BroadcastReceiver {
       /*    接收广播、处理数据   */
       @Override
       public void onReceive(Context context, Intent intent) {
           if (intent != null){
               //判断字符串是否相等TextUtils.equals().
               if (TextUtils.equals(intent.getAction(),MainActivity.COM_EXAMPLE_TEST_BROADCAST)){
                   String toastString = intent.getStringExtra("toast");
                   Toast.makeText(context,toastString,Toast.LENGTH_SHORT).show();
               }
           }
       }
       }
  • BroadcastReceiver的生命周期:Register – SendBroadcast – onReceive – unRegister

Widget安卓桌面显示插件

  • http://blog.csdn.net/harvic880925/article/details/41445407

  • 以下内容基本摘抄自上面这个博客,因为写的很好且详细,所以推荐直接看这个,自己这里只介绍一部分内容

  • App Widget是应用程序窗口小部件(Widget)是微型的应用程序视图,它可以被嵌入到其它应用程序中(比如桌面)并接收周期性的更新。你可以通过一个App Widget Provider来发布一个Widget。官方文档地址:http://developer.android.com/guide/topics/appwidgets/index.html
    这里涉及到两个方面的内容:AppWidgetProvider类和appwidget-provider标签;

  • 1、appwidget-provider标签:定义桌面widget的大小,初始状态等等信息

    android:minWidth : 最小宽度
    android:minHeight : 最小高度
    android:updatePeriodMillis : 更新widget的时间间隔(ms),"86400000"为1个小时
    android:previewImage : 预览图片
    android:initialLayout : 加载到桌面时对应的布局文件
    android:resizeMode : widget可以被拉伸的方向。horizontal表示可以水平拉伸,vertical表示可以竖直拉伸
    android:widgetCategory : widget可以被显示的位置。home_screen表示可以将widget添加到桌面,keyguard表示widget可以被添加到锁屏界面。
    android:initialKeyguardLayout : 加载到锁屏界面时对应的布局文件
  • 2、AppWidgetProvider类:

上面我们通过appwidget-provider标签就可以得到初始化的布局,视图等,但我们的widget要实时更新怎么办,要响应用户操作怎么办,这就需要额外的类来辅助处理了,这个类就是AppWidgetProvider。

由于AppWidgetProvider要接收到当前widget的状态(是否被添加,是否被删除等),所以要接收通知,必然是派生自BroadcastReceiver。

AppWidgetProvider中的广播处理函数如下:(根据不同的使用情况,重写不同的函数)

onUpdate():

在3种情况下会调用OnUpdate()。onUpdate()是在main线程中进行,因此如果处理需要花费时间多于10秒,处理应在service中完成。(第二篇会讲为什么还要有service)
(1)在时间间隔到时调用,时间间隔在widget定义的android:updatePeriodMillis中设置;
(2)用户拖拽到主页,widget实例生成。无论有没有设置Configure activity,我们在Android4.4的测试中,当用户拖拽图片至主页时,widget实例生成,会触发onUpdate(),然后再显示activity(如果有)。这点和资料说的不一样,资料认为如果设置了Configure acitivity,就不会在一开始调用onUpdate(),而实验显示当实例生成(包括创建和重启时恢复),都会先调用onUpate()。在本例,由于此时在preference尚未有相关数据,创建实例时不能有效进行数据设置。
(3)机器重启,实例在主页上显示,会再次调用onUpdate()

onDeleted(Context, int[]):

当 widget 被删除时被触发。

onEnabled(Context):

当第1个 widget 的实例被创建时触发。也就是说,如果用户对同一个 widget 增加了两次(两个实例),那么onEnabled()只会在第一次增加widget时触发。

onDisabled(Context):

当最后1个 widget 的实例被删除时触发。

onReceive(Context, Intent):

在接收到广播时,调用。

Webview

  • 网页显示器,显示网页、解析网页、加载网页。

参考:
http://blog.csdn.net/sinat_16640839/article/details/50976429
http://blog.csdn.net/harvic880925/article/details/41445407

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值