• Android:Service通知Activity更新界面


    Android有四大组件,其中包括service和activity,那么在使用的过程中,我们最常遇到的问题是他们之间的通信问题。

    1.首先Activity调用Service

    这个是比较基础的,它有两种常见的方法;

    1. 通过Intent

    可以指定package name和class name的方式来调用,Intent.setClassName这个成员即可。通过putString来装载数据,startService(intent)即可例子如下:

    Intent regIntent = new Intent(“com.service”);
    regIntent.putExtra(“data”, "helloData");
    startService(regIntent);

    2.通过IPC

    IPC有点复杂,想要了解的可以去查有关IBinder的一些资料。

    2.Service将状态告诉Activity

    方法有两种

    1.service 通过广播的形式发送broadcast

    我们写一个broadcastReceiver即可,通常的情况,将broadcastReceiver写成Activity的内部类,这个onReceiver可以直接调用activity的方法来更新界面。但是内部类只能采用代码注册的方法registerReceiver(),不能再AndroidManifest.xml文件中进行静态的声明,因为内部类要依赖于外部类而存在的。如果你一定要用AndroidManifest来注册receiver,那么只能把broadcastReceiver写成单独的文件的public类。这时候,你想更新界面就比较麻烦了,你只能自己把你要更新的activity运行起来,然后再向这个activity的内部类发广播的消息来更新界面

    2.service直接向activity发intent

    在service里面进行startActivity是属于在Activity外startActivity即在task外启动activity,因此,必须在intent加入一个参数如下:

    Intent intentSend = new Intent(Constants.ACTION_STATUS);
    
    intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    
    intent1.putExtra(“statues“,“end“);
    
    context.startActivity(intent1);

    但是此时会引发的一个问题是,多次startActivity会导致很多的activity实现被运行,这肯定不是我们要的,我只要一个Activity就可,此时,我们要在androidManifest里面对这个activity的launchMode设置为singleInstance

    <activity android:name="com.demo.Activity"
    android:label="@string/online" android:launchMode="singleInstance">

    记住啦,有人设置为singleTask,也可以,但他们有一点区别。

    同时记住要更新intent,这样getInstent才可以得到每次的新实例

    @Override
    
    protected void onNewIntent (Intent intent){
    
        setIntent(intent);
    
    }
  • 相关阅读:
    Google Code 项目代码托管网站上 Git 版本控制系统使用简明教程
    C/C++预定义宏
    使用 Raspberry Pi 远程桌面
    Vim 中将 tab 自动转换成空格
    DR模式搭建LVS负载均衡
    NAT模式LVS搭建负载均衡集群
    php扩展memached安装
    raw_input与input的区别
    keepalived+lvs搭建高可用负载均衡集群
    使用keepalived搭建nginx高可用
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/9008004.html
Copyright © 2020-2023  润新知