ANDROID 广播机制

android 服务和广播机制(service和broadcast) 主要完成手机背景的定时切换功能,根据你选择的图片完成每天背景的切换 立即下载

目录

一、广播概述

一、概述
广播(Broadcast)机制用于进程/线程间通信,其中广播接收者BroadcastReceiver便是Android四大组件之一。因此在我们应用程序内发出的广播,其他的应用程序应该也是可以收到的。广播分为广播发送和广播接收两个过程。
发送广播的方法是使用Intent,而接收广播使用的是广播接收者(Broadcast Receiver)
BroadcastReceiver分为两类:

静态广播接收者:通过AndroidManifest.xml的标签来申明的BroadcastReceiver。
动态广播接收者:通过AMS.registerReceiver()方式注册的BroadcastReceiver,动态注册更为灵活,可在不需要时通过unregisterReceiver()取消注册。

从广播发送方式可分为二类:

标准广播(Normal broadcasts):通过Context.sendBroadcast()发送,是一种完全异步执行的广播
有序广播(Ordered broadcasts):通过Context.sendOrderedBroadcast()发送,是一种同步执行的广播

广播的功能和特征:
  1、广播的生命周期很短,经过 调用对象—实现onReceive—结束 整个过程就结束了。从实现的复杂度和代码量来看,广播无疑是最迷你的Android 组件,实现往往只需几行代码。广播对象被构造出来后通常只执行BroadcastReceiver.onReceive方法,便结束了其生命周期。所以有的时候我们可以把它当做函数看也未必不可。

2、和所有组件一样,广播对象也是在应用进程的主线程中被构造,所以广播对象的执行必须是要同步且快速的。也不推荐在里面开子线程,因为往往线程还未结束,广播对象就已经执行完毕被系统销毁。如果需要完成一项比较耗时的工作 , 应该通过发送 Intent 给 Service, 由 Service 来完成。

3、每次广播到来时 , 会重新创建 BroadcastReceiver 对象 , 并且调用 onReceive() 方法 , 执行完以后 , 该对象即被销毁 . 当 onReceive() 方法在 10 秒内没有执行完毕, Android 会认为该程序无响应。

应用场景

  • 同一应用具有多个进程的不同组件之间的消息通信
  • 不同应用间的组件之间的消息通信
  • 与Android系统在特定情况下的通信
    如:系统开机,网络变化等

二、接收广播之注册广播

注册广播有两种方式:动态注册和静态注册

1、非常驻型广播(动态注册):非常驻型广播,广播跟随程序的生命周期,当应用程序结束了,广播自然就没有了,比如在 Activity 中的 onCreate 或者 onResume 中注册广播接收者,在 onDestory 中注销广播接收者。这样你的广播接收者就一个非常驻型的了,这种注册方式也叫动态注册。这种方式可以理解为通过代码注册的广播是和注册者关联在一起的。动态注册的广播,最后必须取消注册。这类广播,只有应用启动了,才能接收到广播。

实现动态注册需要以下内容

  • 一个广播接收器类 —— 实质就是一个继承自BoradCastReceiver的类,只要继承这个类,就有具体接收广播的能力了。
  • 重写父类的onReceive()方法 —— 接收到广播的时候,就会回调这个方法。因此,广播接收
    器的处理逻辑就写在这里。
  • 一个 IntentFilter 对象,广播接收器接收什么样的广播,由它的addAction()方法决定。
  • 在代码中注册广播接收器,通过registerReceiver方法。方法接受两个参数,一个是广播接收
    器实例,一个是IntentFilter实例。
    取消注册广播 ,通过unregisterReceiver() 方法—— 在哪里取消注册无所谓,只要保证取
    消注册就OK。
  • 如果需要权限,则在AndroidManifest.xml文件申明权限
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
 
public class MainActivity extends AppCompatActivity {
 
    private IntentFilter intentFilter;
    private NetworkChangeReceiver networkChangeReceiver;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        intentFilter = new IntentFilter();
        //网络发生变化时系统发出的是一条值为android.net.conn.CONNECTIVITY_CHANGE的广播,
        //即想监听什么广播就在此添加相应action
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        //创建NetworkChangeReceiver实例
        networkChangeReceiver = new NetworkChangeReceiver();
        //注册实例
        registerReceiver(networkChangeReceiver, intentFilter);
    }
 
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //动态注册的广播接收器需取消注册
        unregisterReceiver(networkChangeReceiver);
    }
 
    /**
     * 继承自BroadcastReceiver,并重写了onReceive()。当网络状态发生变化时,onReceive()方法便会执行
     */
    class NetworkChangeReceiver extends BroadcastReceiver {
 
        @Override
        public void onReceive(Context context, Intent intent) {
            ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
            //判断当前是否有网络
            if (networkInfo != null && networkInfo.isAvailable()) {
                Toast.makeText(context, "network is available", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(context, "network is unavailable", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

2、常驻型广播(静态注册)

在AndroidManifest.xml文件中注册的广播。这类广播,常驻广播,在应用未启动的时候,即可接收到广播,处理相应的逻辑。
通过< receiver >这个标签进行注册

<receiver
    //BroadcastReceiver子类的类名
    android:name="string"

    //是否使用该BroadcastReceiver
    android:enabled=["true" | "false"]

    //此broadcastReceiver能否接收其他App的发出的广播
    //其默认值是由receiver中有无intent-filter决定的,如果有intent-filter,默认值为true,否则为false
    android:exported=["true" | "false"]
  
    android:icon="drawable resource"
    android:label="string resource"

    //具有相应权限的广播发送方发送的广播才能被此broadcastReceiver所接收
    android:permission="string"

    //broadcastReceiver运行所处的进程。
    //默认为app的进程,可以指定独立的进程
    //Android四大基本组件都可以通过此属性指定自己的独立进程
    android:process="string">

    //指定此广播接收器将用于接收特定的广播类型
    //本例中给出的时系统开机后自身发出的广播
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>

三、发送广播

标准广播

		Intent intent = new Intent();
        intent.setAction(BROADCAST_ACTION);
        //最普通的发送方式
        sendBroadcast(intent);
        //附带权限的发送方式,声明此权限的BroadcastReceiver才能接收此广播
        sendBroadcast(intent,RECEIVER_PREMISSION);

有序广播
有序广播与标准广播的发送方式,在代码中只有一句代码有差别,就是发送广播的方法不同。发送出去的广播被BroadcastReceiver按照先后循序接收。有序广播的有序广播中的“有序”是针对广播接收者而言的。
对于有序广播,其主要特点总结如下:

1>多个具当前已经注册且有效的BroadcastReceiver接收有序广播时,是按照先后顺序接收的,先后顺序判定标准遵循为:将当前系统中所有有效的动态注册和静态注册的BroadcastReceiver按照priority属性值从大到小排序,对于具有相同的priority的动态广播和静态广播,动态广播会排在前面。
2>先接收的BroadcastReceiver可以对此有序广播进行截断,使后面的BroadcastReceiver不再接收到此广播,也可以对广播进行修改,使后面的BroadcastReceiver接收到广播后解析得到错误的参数值。当然,一般情况下,不建议对有序广播进行此类操作,尤其是针对系统中的有序广播。

四、服务机制

Service是Android中实现程序后台运行的解决方案,它非常适用于去执行那些不需要和用户交互而且还要求长期运行的任务。Service默认并不会运行在子线程中,它也不运行在一个独立的进程中,它同样执行在UI线程中,因此,不要在Service中执行耗时的操作,除非你在Service中创建了子线程来完成耗时操作
Service的运行不依赖于任何用户界面,即使程序被切换到后台或者用户打开另一个应用程序,Service仍然能够保持正常运行,这也正是Service的使用场景。当某个应用程序进程被杀掉时,所有依赖于该进程的Service也会停止运行
实际上服务不会自动开启线程,所有代码都是默认在主线程中的。也就是说我们需要在服务内部手动创建子线程。

五、定义、开启、停止服务

public class MyService extends Service {  
      
    public static final String TAG = "MyService";  
  
    //创建服务时调用
    @Override  
    public void onCreate() {  
        super.onCreate();  
        Log.d(TAG, "onCreate");  
    }  
  
    //服务执行的操作
    @Override  
    public int onStartCommand(Intent intent, int flags, int startId) {  
        Log.d(TAG, "onStartCommand");  
        return super.onStartCommand(intent, flags, startId);  
    }  
      
    //销毁服务时调用
    @Override  
    public void onDestroy() {  
        super.onDestroy();  
        Log.d(TAG, "onDestroy");  
    }  
  
    @Override  
    public IBinder onBind(Intent intent) {  
        return null;  
    }  
}

我们创建一个MyService类继承自Service。在这里我们可以看到我们重写了onCreate()、onStartCommand()、onDestroy()、onBind()方法。onCreate()在服务创建时候调用,onStartCommand()会在每次服务启动时候被调用,如果我们希望服务一旦启动就立即去执行某个动作,就可以将逻辑写在这里。onDestroy()在服务被销毁时,去回收不再使用的资源。onBind()在bindService()启动时调用,是Service唯一一个抽象方法。

服务的启动方式有两种:一种是startService(),另一种是bindService()

public class MainActivity extends Activity implements OnClickListener {  
      
    private Button button1_start_service;  
  
    private Button button2_stop_service;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        button1_start_service = (Button) findViewById(R.id.button1_start_service);  
        button2_stop_service = (Button) findViewById(R.id.button2_stop_service);  
        button1_start_service.setOnClickListener(this);  
        button2_stop_service.setOnClickListener(this);  
    }  
  
    @Override  
    public void onClick(View v) {  
        switch (v.getId()) {  
        case R.id.button1_start_service:  
            Intent startIntent = new Intent(this, MyService.class);  
            startService(startIntent);  
            break;  
        case R.id.button2_stop_service:  
            Intent stopIntent = new Intent(this, MyService.class);  
            stopService(stopIntent);  
            break;  
        default:  
            break;  
        }  
    }  
  
}

我们也可以在MyService中使用stopSelf()自动使服务停止下来。我们总结为
停止一个started服务有两种方法:
(1)在外部使用stopService()
(2)在服务内部(onStartCommand方法内部)使用stopSelf()方法。

六、IntentService的使用

服务中的代码默认运行在主线程中,如果直接在服务里执行一些耗时操作,容易造成ANR(Application Not Responding)异常,所以就需要用到多线程的知识了。
为了可以简单地创建一个异步的、会自动停止的服务,Android专门提供了一个IntentService类。IntentService的作用:当我们需要这样一次性完成的任务时,就可以使用IntentService来完成。

我们新建一个MyIntentService类,继承自IntentService,并重写父类的onHandleIntent()方法,代码如下:

package com.example.servicetest;

import android.app.IntentService;
import android.content.Intent;
import android.util.Log;

public class MyIntentService extends IntentService{

    public MyIntentService() {
        super("MyIntentService");//调用父类有参构造函数。这里我们手动给服务起个名字为:MyIntentService
        // TODO Auto-generated constructor stub
    }

    //该方法在会在一个单独的线程中执行,来完成工作任务。任务结束后,该Service自动停止
    @Override
    protected void onHandleIntent(Intent intent) {
        // TODO Auto-generated method stub
        for(int i = 0;i<3;i++) {
            //打印当前线程的id
            Log.d("MyIntentService","IntentService线程的id是:"+Thread.currentThread().getId());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }        
    }

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        Log.d("MyIntentService","onDestroy");
    }
}

这里首先要提供一个无参的构造方法,并且必须在其内部调用父类的有参构造方法(9至12行),我们在第10行手动将服务的名字改为“MyIntentService”。
然后在子类中实现onHandleIntent()这个抽象方法,可以在这个方法里去处理一些具体的逻辑,我们就用三次for循环,打印当前线程的id,每次延时1秒。
因为这个服务在运行结束后会自动停止,所以我们在onDestroy()方法中打印日志验证一下。

在MainActivity里面加入启动IntentService的逻辑,核心代码如下:

             Log.d("MainActivity","主线程的id是:"+Thread.currentThread().getId());
            Intent intentService = new Intent(this,MyIntentService.class);
            startService(intentService);

由此可见,启动一个IntentService和启动一个普通的Service,步骤是一样的。

七、活动与服务通讯

Bind Service的介绍:
应用程序组件(客户端)通过调用bindService()方法能够绑定服务,然后Android系统会调用服务的onBind()回调方法,则个方法会返回一个跟服务器端交互的Binder对象。
这个绑定是异步的,bindService()方法立即返回,并且不给客户端返回IBinder对象。要接收IBinder对象,客户端必须创建一个ServiceConnection类的实例,并且把这个实例传递给bindService()方法。ServiceConnection对象包含了一个系统调用的传递IBinder对象的回调方法。
注意:只有Activity、Service、Content Provider能够绑定服务;BroadcastReceiver广播接收器不能绑定服务。

package com.example.servicetest;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;

public class MyService extends Service {  
      
    public static final String TAG = "MyService";  
  
    private MyBinder mBinder = new MyBinder();  
  
    @Override  
    public void onCreate() {  
        super.onCreate();  
        Log.d(TAG, "onCreate");  
    }  
  
    @Override  
    public int onStartCommand(Intent intent, int flags, int startId) {  
        Log.d(TAG, "onStartCommand");  
        return super.onStartCommand(intent, flags, startId);  
    }  
  
    @Override  
    public void onDestroy() {  
        super.onDestroy();  
        Log.d(TAG, "onDestroy");  
    }  
  
    @Override  
    public IBinder onBind(Intent intent) {  
        return mBinder;  //在这里返回新建的MyBinder类
    }  
  
    //MyBinder类,继承Binder:让里面的方法执行下载任务,并获取下载进度
    class MyBinder extends Binder {  
  
        public void startDownload() {  
            Log.d("TAG", "startDownload() executed");  
            // 执行具体的下载任务  
        }
        public int getProgress(){
            Log.d("TAG", "getProgress() executed");  
            return 0;
        }
  
    }  
  
}
package com.example.servicetest;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener {

    private Button button1_start_service;
    private Button button2_stop_service;
    private Button button3_bind_service;
    private Button button4_unbind_service;

    private MyService.MyBinder myBinder;
    
    //匿名内部类:服务连接对象
    private ServiceConnection connection = new ServiceConnection() {
        
        //当服务异常终止时会调用。注意,解除绑定服务时不会调用
        @Override
        public void onServiceDisconnected(ComponentName name) {
        }
        
        //和服务绑定成功后,服务会回调该方法
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            myBinder = (MyService.MyBinder) service;
            //在Activity中调用Service里面的方法
            myBinder.startDownload();
            myBinder.getProgress();
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button1_start_service = (Button) findViewById(R.id.button1_start_service);
        button2_stop_service = (Button) findViewById(R.id.button2_stop_service);
        button3_bind_service = (Button) findViewById(R.id.button3_bind_service);
        button4_unbind_service = (Button) findViewById(R.id.button4_unbind_service);

        button1_start_service.setOnClickListener(this);
        button2_stop_service.setOnClickListener(this);
        button3_bind_service.setOnClickListener(this);
        button4_unbind_service.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.button1_start_service:
            Intent startIntent = new Intent(this, MyService.class);
            startService(startIntent);
            break;
        case R.id.button2_stop_service:
            Intent stopIntent = new Intent(this, MyService.class);
            stopService(stopIntent);
            break;
        case R.id.button3_bind_service:
            Intent bindIntent = new Intent(this, MyService.class);
            bindService(bindIntent, connection, BIND_AUTO_CREATE);
            break;
        case R.id.button4_unbind_service:
            unbindService(connection);
            break;

        default:
            break;
        }
    }

}

可以看到,这里我们首先创建了一个ServiceConnection的匿名类(24行),在里面重写了onServiceConnected()方法和onServiceDisconnected()方法,如果当前Activity与服务连接成功后,服务会回调onServiceConnected()方法,

在onServiceConnected()方法中,我们又通过向下转型得到了MyBinder的实例(34行),有了这个实例,Activity和Service之间的关系就变得非常紧密了。现在我们可以在Activity中根据具体的场景来调用MyBinder中的任何public方法(36、37行),即实现了Activity指挥Service干什么Service就去干什么的功能。

started服务与bind服务的区别:

区别一:生命周期

通过started方式的服务会一直运行在后台,需要由组件本身或外部组件来停止服务才会以结束运行
bind方式的服务,生命周期就要依赖绑定的组件
区别二:参数传递

started服务可以给启动的服务对象传递参数,但无法获取服务中方法的返回值
bind服务可以给启动的服务对象传递参数,也可以通过绑定的业务对象获取返回结果
实际开发中的技巧;

第一次先使用started方式来启动一个服务
之后可以使用bind的方式绑定服务,从而可以直接调用业务方法获取返回值

Android 利用广播调用服务(Service)中的方法 在Activity中时不能直接调用服务(Service)中的方法的。如果需要调用服务中的方法,可以考虑通过发送广播的形式,调用服务中的方法。 立即下载

相关推荐

logisim计组实验八 乘法器

原理:点这里 有问题欢迎留言哦~ 文章目录五位阵列乘法器电路图时间延迟分析六位补码阵列乘法器五位无符号乘法流水线原理图电路图原码一位乘法器原理图电路图补码一位乘法器 五位阵列乘法器 电路图 此处注意:全加器FA的cout端是进位端而非输出端 使用硬件控制比循环累加的速度快得多。 但是存在串行进位链 改进版: 时间延迟分析 T是计算相加数的一级门延迟 3n–>2n 性能差别在1.5倍 ...

treblez's blog 2万+

实战-Android限制应用接收广播启动

限制应用接收系统广播启动

u010927489的专栏 1597

【昇腾】用MindIE(服务化方式)拉起glm4-9b-chat模型问题解决

【昇腾】用MindIE拉起glm4-9b-chat模型问题解决: LLMInferEngine failed to init LLMInferModels ERR: Failed to init endpoint! Please check the service log or console output. Killed make sure the folder's owner has execute permission.

u014448841的博客 5116

Android 四大组件你都知道吗

Android 四大组件你都知道吗 四大组件分别是:活动,服务,广播,内容提供器。 先来介绍下,对其有个大概的了解。 1.活动就是一个用户交互界面2.服务,你可以理解为后台组件,用于服务活动的; 3.广播,是一个可以发送一个消息,然后再去收这个消息。这个消息可以是系统发给你的,也可以是你自己发,让其​自己接收。 4.内容提供器,实现了共享数据的组件,用于不同应用之间共享数据。 ...

R_ine的博客 601

nvidia系列教程-AGX-Orin usb3.0接口调试

NVIDIA Jetson AGX Orin 是一款高性能的嵌入式计算平台,适用于 AI 推理、机器人、自动驾驶等应用场景。本文将介绍如何对 AGX Orin 平台上的 USB 3.0 接口进行调试,包括硬件检查、软件配置以及常见问题的排查。本文主要介绍在AGX-Orin平台开启两个usb3.0口的方法。通过以上步骤,您可以有效地调试和优化 NVIDIA Jetson AGX Orin 上的 USB 3.0 接口。

flypig has a dream! 1502

正确解决Authentication plugin ‘caching _sha2_password’ cannot be loaded:异常的有效解决方法

正确解决Authentication plugin ‘caching _sha2_password’ cannot be loaded:异常的有效解决方法

wbajsjhhhhh的博客 1万+

22、23 .内容观察者、广播和服务

内容访问者 内容访问者: 1.获取提供者:getContentResolver(); ContentResolver 对象 2.访间内容提供者:增删改查 ContentResolver resolver= getContentResolver(); uri uri=uri.parse("content://com. provider111/query"); Cursor cursor= resolver . query(uri ,null ,null ,null,null); if(cursor!=nu1.

weixin_45800880的博客 251

YOLO系列专栏(六):YOLO26热力图可视化 | 解析模型推理逻辑,定位检测关键区域

YOLO26作为新一代目标检测模型,其核心优势是高效的特征提取和精准的目标定位,但模型内部的推理过程的“黑盒”特性,给我们的优化带来了很大困扰:❌ 检测精度低:不知道是模型没学到关键特征,还是特征提取不充分;❌ 出现误检/漏检:无法定位问题根源——是锚框不合适?还是特征图未捕捉到目标?❌ 模型优化盲目:调参、修改网络结构全靠“猜”,缺乏针对性;❌ 难以解释模型行为:实际项目中,需要说明模型“为什么检测到这个目标”,尤其是医疗、工业等对可解释性要求高的场景。而热力图可视化。

qq_36130719的博客 732

android常驻型广播,Android 常驻与非常驻型广播的区别,及ListView优化,Android新手基本知识巩固...

1.常驻型广播常驻型广播,当你的应用程序关闭了,如果有广播信息来,你写的广播接收器同样的能接受到,他的注册方式就是在你的应用程序中的AndroidManifast.xml进行注册。通常说这种方式是静态注册下面是配置例子2345 6 78lt;/receiver>2.非常驻型广播当应用程序结束了,广播自然就没有了,比如你在activity中的onCreate或者onResume中注册广播接收器...

weixin_39778218的博客 328

24、JavaFX MP3 音频播放器开发详解

本文详细介绍了如何使用JavaFX开发一个功能丰富的MP3音频播放器,涵盖文件拖放加载、音频播放控制、音频频谱可视化、进度定位滑块等核心功能,并提供了完整的代码实现和解析。适合希望学习JavaFX多媒体应用开发的开发者参考。

wind6的博客 170

海洋捕食者算法(MPA)详解:从海洋生态智慧到高性能优化

摘要: 海洋捕食者算法(MPA)是一种基于海洋生态觅食行为的元启发式优化算法,模拟捕食者(如鲨鱼)的布朗运动和莱维飞行策略进行全局与局部搜索。算法分为三阶段:高速比阶段(全局探索)、单位速度比阶段(平衡搜索)和低速比阶段(局部开发),通过精英矩阵和FADs效应(概率扰动)避免早熟收敛。MPA具有参数少、收敛快、寻优能力强等特点,适用于复杂优化问题,其数学模型将生物行为转化为随机游走与自适应策略,并通过收敛因子动态调整探索-开发平衡。实验表明,MPA在多个基准问题上表现优异。

qq_42212808的博客 273

Android 服务和广播的简单用法

今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司20年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。还有。

2401_84148955的博客 706

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

探秘安卓广播:揭秘Android广播机制的神奇之处

当系统提供的广播不能满足实际需求时,可以自定义广播,同时需要编写对应的广播接收者。当自定义广播发送消息时,会储存到公共消息区中,而公共消息区中如果存在对应的广播接收者,就会及时的接收这条信息。

缘友一世的博客 1439

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Android:安卓学习笔记之广播机制的简单理解和使用

广播机制的简单理解和使用广播机制广播简介广播分为两大类1.标准广播(Normal broadcasts)2.有序广播(Ordered broadcasts)注册方式静态注册广播动态注册广播两种注册各有什么优缺点发送无序广播发送有序广播常见问题1、怎样设置有序广播的接收顺序呢?2、前面的广播接收器怎样截断正在传递的广播呢?3、BrocastReceiver 里可不可以执行耗时操作4、BroadcastReceiver,LocalBroadcastManager 区别5、如何通过广播拦截和 abort 一条短信

JMW1407的博客 3936

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

简介安卓广播机制 Android Broadcast

目录 前言——手机的“小动作” 什么是广播? 有了服务为什么还需要广播? 常见的系统action 广播有哪些成员? 广播发送者 广播的发送过程 广播发送过程时序图 广播的两种发送方式 广播接受者 广播接受者的注册过程 广播注册过程时序图 广播的两种注册方式 前言——手机的“小动作” 如电量低到一定程度会有低电量提醒,插入电源线时炫酷的动画,充满电时又会显示电量已充满,以及当手机开机时显示“欢迎使用中国移动/联通/电信”提醒,关闭wifi、数据时会弹出“网络不可用”等,这..

qq_40116303的博客 935

Android Service 服务 安卓广播机制

转载地址:http://m.blog.youkuaiyun.com/blog/lgzvic/17842149 作者:镇长的博客 Service简介 Service是android 系统中的四大组件之一(Activity、Service、BroadcastReceiver、ContentProvider),它跟Activity的级别差不多,但不能自己运行只能后台运行,并且可以和其他组件进行交互

yunbin_7的专栏 1332

安卓学习笔记——Android中的广播机制

1、Android广播机制: Android系统中的广播跟传统现实生活中的电台广播有些相似之处。之所以叫做广播,就是因为它只负责“说”而不管“听不听”,也就是不管接收方如何处理。另外,广播可以被不只一个应用程序所接收,当然也可能不被任何应用程序所接收。 Android系统中内置了很多系统级别的广播,如: 电池的状态(如:电量不足) 短信的接收和发送 电话的接听和拨打 系统闹钟 系统垃圾文件占用内存过多 等等,都会产生一条广播。 2、BroadcastReceiver组件:用于监听这些广播事件 Broadc

fuzhijieabc的博客 313

安卓广播机制讲解(标准广播和有序广播)

安卓广播机制讲解 广播分为标准广播和有序广播 标准广播(Normal broadcasts)是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因此它们之间没有任何先后顺序可言。这种广播的效率会比较高,但同时也意味着它是无法被截断的。标准广播的工作流程如图所示。 有序广播(Ordered broadcasts )则是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。所以此时

天行健 君子以自强不息,地势坤 君子以厚德载物。 5131

【Android】广播机制

在Android中,广播(Broadcast)是一种消息,任何应用程序都可以发送广播消息,任何应用程序也都可以接收广播消息。广播通常用于通知应用程序某些事件的发生,比如系统启动、电量低、网络状态改变等。Broadcast Receiver(广播接收器):用于接收广播消息并响应这些消息的组件。Intent(意图):用于传递广播消息的数据结构。标准广播(Normal Broadcast)是完全异步的,所有接收器几乎同时接收广播,并且接收顺序是不确定的。

2301_79977698的博客 1667

Android广播机制

1.广播机制的描述 Android的广播机制可以分为两部分:广播接收者,广播发送者,这和Qt的信号与槽机制相类似,都有信号的发送者和信号的接收者。信号和槽机制可用于Qt各个模块之间的通讯,可以传递信号以及数据。广播机制就是Andoid组件之间的通讯方式。有以下几种使用环境: (1)同一app内部的同一组件内的消息通信(单个或多个线程之间); (2)同一app内部的不同组件之间的消息通信(单个进程); (3)同一app具有多个进程的不同组件之间的消息通信; (4)不同app之间的组件之间消息通信;

myfansty的博客 3247

【安卓开发】安卓广播机制

标准广播:完全异步执行,广播发出后,所有广播接收器几乎都同一时刻收到这条广播(无法被截断)有序广播:同步执行,广播发出后同一时刻只会有一个广播接收器能收到这条广播消息,前面的接收器可以截断正在传递的广播} });通过点击按钮发送广播} }这里是自定义的接收器< receiver在xml中定义过滤的广播类型。

Godam 813

安卓——广播机制

标准广播 有序广播 异步执行,同步接收无法被截断 同步执行,中途可以被优先级高的广播截断 接收系统广播 1.动态注册 public class MainActivity extends AppCompatActivity { private IntentFilter intentFilter; private NetworkChangeReceiver netw...

qq_43228039的博客 210

安卓源码:广播机制

在Android系统中,广播(BroadCast)是组件之间传播数据(Intent)的一种机制;这些组件甚至是可以位于不同的进程中,这样它就像Binder机制一样,起到进程间通信的作用.BroadcastReceiver也有自己独立的生命周期,但是它又和Activity、Service不同。在发送广播时,可以通过设置属性来将广播定义为前台广播,如果未定义,默认为后台广播。1.广播接受者的生命周期是非常短暂的,在接受到广播的时候创建,onReceive()方法结束后销毁。............

mike_jun的博客 1万+

安卓开发之广播机制

1.广播机制简介 标准广播(normal broadcasts):完全异步执行,广播发出后,所有的广播接收器都会在同一时刻接收到这条广播消息 有序广播 (ordered broadcasts):同步执行,同一时刻只有一个广播接收器收到,当执行完后再继续传递。优先级高的广播接收器可以先收到消息,还可以截断广播接收器。 2.接收系统广播 动态注册监听网络变化 在代码中注册称为动态注册,在AndroidManifest.xml注册称为静态注册。 1.新建一个BroadcastTest项目,然后修改Mai

qq_39176095的博客 312
上一篇: Fragment讲解
下一篇: Android网络编程
CacheU
博客等级 码龄8年 3粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值