Android 四大组件 —— 广播(广播机制解析)

 在网络通信中,一个IP网络范围中最大的IP 地址是被保留作为广播地址来使用的。比如某个网络的IP 范围是192.168.0.XXX,子网掩码是255.255.255.0,那么这个网络的广播地址就是192.168.0.255。广播数据包会被发送到同一网络上的所有端口,这样在该网络中的每台主机都将会收到这条广播。

        为了方便于进行系统级别的消息通知,Android 也引入了一套类似的广播消息机制。相比于我前面举出的两个例子,Android 中的广播机制会显得更加的灵活,本章就将对这一机制的方方面面进行详细的讲解。

 

一、 广播机制简介

        为什么说Android 中的广播机制更加灵活呢?这是因为Android 中的每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接收到自己所关心的广播内容,这些广播可能是来自于系统的,也可能是来自于其他应用程序的。Android 提供了一套完整的API,允许应用程序自由地发送和接收广播。发送广播的方法其实之前稍微有提到过一下,如果你记性好的话可能还会有印象,就是借助我们学过的Intent。而接收广播的方法则需要引入一个新的概念,广播接收器(Broadcast Receiver)。

        广播接收器的具体用法将会在下一节中做介绍,这里我们先来了解一下广播的类型。Android 中的广播主要可以分为两种类型,标准广播和有序广播。

       标准广播(Normal broadcasts)是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因此它们之间没有任何先后顺序可言。这种广播的效率会比较高,但同时也意味着它是无法被截断的。标准广播的工作流程如下图:

 

      有序广播(Ordered broadcasts)则是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。所以此时的广播接收器是有先后顺序的优先级高的广播接收器就可以先收到广播消息,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息了。有序广播的工作流程如图:

 

二、接收系统广播

       Android 内置了很多系统级别的广播,我们可以在应用程序中通过监听这些广播来得到各种系统的状态信息。比如手机开机完成后会发出一条广播,电池的电量发生变化会发出一条广播,时间或时区发生改变也会发出一条广播等等。如果想要接收到这些广播,就需要使用广播接收器,下面我们就来看一下它的具体用法。

1、 动态注册监听网络变化

       广播接收器可以自由地对自己感兴趣的广播进行注册,这样当有相应的广播发出时,广播接收器就能够收到该广播,并在内部处理相应的逻辑。注册广播的方式一般有两种,在代码中注册和在AndroidManifest.xml 中注册,其中前者也被称为动态注册,后者也被称为静态注册

       那么该如何创建一个广播接收器呢?其实只需要新建一个类,让它继承自BroadcastReceiver,并重写父类的onReceive()方法就行了。这样当有广播到来时,onReceive()方法就会得到执行,具体的逻辑就可以在这个方法中处理。

       那我们就先通过动态注册的方式编写一个能够监听网络变化的程序,借此学习一下广播接收器的基本用法吧。新建一个BroadcastTest 项目,然后修改MainActivity 中的代码,其中重要的代码如下所示,该部分在onCreate 方法中实现

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. IntentFilter myintentfilter = new IntentFilter();  
  2. myintentfilter.addAction("time");  
  3.           
  4. MyBroadCast mybroadcast = new MyBroadCast();  
  5.           
  6. registerReceiver(mybroadcast,myintentfilter);  

第一步:这里先创建一个IntentFilter 实例,并在其addAction 中添加我们要监听的广播,这里是"time”,静态注册则把这一步在AndroidManifest.xml 中完成;
第二步:创建了一个MyBroadCast 实例,然后调用registerReceiver 方法进行注册,将MyBroadCast 实例和IntentFilter 实例都传播出去;

这样,mybroadcast 就会收到所有值为"time" 的广播,实现监听功能。

当然,这里我们新建一个类继承自BroadcastReceiver ,并重写 onReceive() 方法:

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. class MyBroadCast extends BroadcastReceiver{  
  2.     Override  
  3.     public void onReceive(Context context, Intent intent) {  
  4.         // TODO Auto-generated method stub  
  5.         int s = intent.getIntExtra("key",0);  
  6.               
  7.         TextView text1 = (TextView) findViewById(R.id.text1);  
  8.         text1.setText("计时: "+s+"秒");      
  9.     }  
  10. }  

通过这个广播,我们也可以利用Intent 的方法,实现传送数据的功能,并对其进行处理。

 

2、静态注册实现开机启动

       动态注册的广播接收器可以自由地控制注册与注销,在灵活性方面有很大的优势,但是它也存在着一个缺点,即必须要在程序启动之后才能接收到广播,因为注册的逻辑是写在onCreate()方法中的。那么有没有什么办法可以让程序在未启动的情况下就能接收到广播呢?这就需要使用静态注册的方式了。

      我们准备让程序接收一条开机广播,当收到这条广播时就可以在onReceive()方法里执行相应的逻辑,从而实现开机启动的功能。新建一个MyReceiver继承自
BroadcastReceiver,代码如下所示:

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. public class MyReceive extends BroadcastReceiver {  
  2.   
  3.     @Override  
  4.     ublic void onReceive(Context context, Intent intent) {  
  5.         // TODO Auto-generated method stub  
  6.         Log.v("MainActivity""我是广播!!!我来了!!!");   
  7.         Toast.makeText(context, "我是广播!!我出来了!!!"0).show();  
  8.     }  
  9. }  

可以看到,这里不再使用内部类的方式来定义广播接收器,因为稍后我们需要在AndroidManifest.xml 中将这个广播接收器的类名注册进去。在onReceive()方法中,还是简单地使用Toast 弹出一段提示信息。

然后修改AndroidManifest.xml 文件,代码如下所示:

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. <receiver   
  2.      android:name="cn.com.qiang.sendbroadcast.MyReceive">  
  3.      <intent-filter >  
  4.          <action android:name="BroadCast"/>  
  5.      </intent-filter>  
  6.  </receiver>  

       终于,<application>标签内出现了一个新的标签<receiver>,所有静态注册的广播接收器都是在这里进行注册的。它的用法其实和<activity>标签非常相似,首先通过android:name来指定具体注册哪一个广播接收器,然后在<intent-filter>标签里加入想要接收的广播就行了,由于Android 系统启动完成后会发出一条值为BroadCast的广播,因此我们在这里添加了相应的action。

      另外,监听系统开机广播也是需要声明权限的,可以看到,我们使用<uses-permission>标签又加入了一条android.permission.RECEIVE_BOOT_COMPLETED 权限

 

三、发送自定义广播

       广播主要分为两种类型,标准广播有序广播,在本节中我们就将通过实践的方式来看下这两种广播具体的区别:

1、发送标准广播

      我们来修改来修改activity_main.xml 中的代码,通过按钮来发送广播

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. <Button   
  2.        android:id="@+id/button1"  
  3.        android:layout_width="match_parent"  
  4.        android:layout_height="wrap_content"  
  5.        android:text="发送广播"/>  

这里在布局文件中定义了一个按钮,用于作为发送广播的触发点。然后修改MainActivity中的代码,如下所示:

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. Button button1 = (Button)findViewById(R.id.button1);  
  2. button1.setOnClickListener(new OnClickListener() {  
  3.     @Override  
  4.     public void onClick(View v) {  
  5.         / TODO Auto-generated method stub  
  6.         Intent intent = new Intent();  
  7.         intent.setAction("BroadCast");  
  8.         sendBroadcast(intent);  
  9.     }  
  10. });  

可以看到,我们在按钮的点击事件里面加入了发送自定义广播的逻辑。首先构建出了一个Intent 对象,并把要发送的广播的值传入,然后调用了Context 的sendBroadcast()方法将广播发送出去,这样所有监听BroadCast 条广播的广播接收器就会收到消息。此时发出去的广播就是一条标准广播

注意:由于广播是使用Intent 进行传递的,因此你还可以在Intent 中携带一些数据传递给广播接收器。

 

2、发送有序广播

       广播是一种可以跨进程的通信方式,这一点从前面接收系统广播的时候就可以看出来了。因此在我们应用程序内发出的广播,其他的应用程序应该也是可以收到的。

      有序广播和标准广播的区别之一是,我们发送广播时,调用的是sendOrderedBroadcast 方法:

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. sendOrderedBroadcast(intent, null);  

其中sendOrderedBroadcast()方法接收两个参数,第一个参数仍然是Intent,第二个参数是一个与权限相关的字符串,这里传入null 就行了。

         广播接收器是有先后顺序的,而且前面的广播接收器还可以将广播截断,以阻止其继续传播。那么该如何设定广播接收器的先后顺序呢?当然是在注册的时候进行设定的了,修改AndroidManifest.xml 中的代码,如下所示:

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. <receiver android:name=".MyBroadcastReceiver">  
  2.     <intent-filter android:priority="100" >  
  3.         <action android:name="com.example.broadcasttest.MY_BROADCAST"/>  
  4.     </intent-filter>  
  5. </receiver>  

      我们通过android:priority 属性给广播接收器设置了优先级,优先级比较高的广播接收器就可以先收到广播。这里将MyBroadcastReceiver 的优先级设成了100,以保证它一定会在AnotherBroadcastReceiver 之前收到广播。

      既然已经获得了接收广播的优先权,那么MyBroadcastReceiver 就可以选择是否允许广播继续传递了。修改MyBroadcastReceiver 中的代码,如下所示:

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. public class MyBroadcastReceiver extends BroadcastReceiver {  
  2.     @Override  
  3.     public void onReceive(Context context, Intent intent) {  
  4.         Toast.makeText(context, "received in MyBroadcastReceive",  
  5.         Toast.LENGTH_SHORT).show();  
  6.         abortBroadcast();  
  7.     }  
  8. }  

     如果在onReceive()方法中调用了abortBroadcast()方法,就表示将这条广播截断,后面的广播接收器将无法再接收到这条广播。现在重新运行程序,并点击一下Send Broadcast 按钮,你会发现, 只有MyBroadcastReceiver 中的Toast 信息能够弹出, 说明这条广播经过MyBroadcastReceiver 之后确实是终止传递了。


     下面我们用一个实例——计时器,将前面学到的活动、服务、广播综合在一起进行学习整合,程序实现的功能很简单,就是在前台实现计时的功能,并能暂停计时,且继续计时时,数字会接上暂停前数据继续跳转,实例图如下:

具体代码如下:

1、MainActivty 端

     主要实现广播的动态注册,广播的发送与接收,开启服务与停止服务的功能,具体代码如下:

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. package cn.com.qiang.timeservice;  
  2.   
  3. import android.os.Bundle;  
  4. import android.app.Activity;  
  5. import android.content.BroadcastReceiver;  
  6. import android.content.Context;  
  7. import android.content.Intent;  
  8. import android.content.IntentFilter;  
  9. import android.view.View;  
  10. import android.view.View.OnClickListener;  
  11. import android.widget.Button;  
  12. import android.widget.TextView;  
  13.   
  14.   
  15. public class MainActivity extends Activity {  
  16.   
  17.     @Override  
  18.     protected void onCreate(Bundle savedInstanceState) {  
  19.         super.onCreate(savedInstanceState);  
  20.         setContentView(R.layout.activity_main);  
  21.   
  22.         IntentFilter myintentfilter = new IntentFilter();  
  23.         myintentfilter.addAction("time");  
  24.         MyBroadCast mybroadcast = new MyBroadCast();  
  25.         registerReceiver(mybroadcast,myintentfilter);  
  26.           
  27.         Button button1 = (Button)findViewById(R.id.button1);  
  28.         button1.setOnClickListener(new OnClickListener() {  
  29.               
  30.             @Override  
  31.             public void onClick(View v) {  
  32.                 // TODO Auto-generated method stub  
  33.                 Intent startintent = new Intent(MainActivity.this,MyService.class);  
  34.                 startService(startintent);  
  35.             }  
  36.         });  
  37.           
  38.         Button button2 = (Button)findViewById(R.id.button2);  
  39.         button2.setOnClickListener(new OnClickListener() {  
  40.               
  41.             @Override  
  42.             public void onClick(View v) {  
  43.                 // TODO Auto-generated method stub  
  44.                 Intent stopintent = new Intent(MainActivity.this,MyService.class);  
  45.                 stopService(stopintent);  
  46.                 TextView text1 = (TextView) findViewById(R.id.text1);  
  47.                 text1.setText("计时: "+"0"+"秒");  
  48.             }  
  49.         });  
  50.           
  51.         Button button3 = (Button)findViewById(R.id.button3);  
  52.         button3.setOnClickListener(new OnClickListener() {        
  53.             @Override  
  54.             public void onClick(View v) {  
  55.                 // TODO Auto-generated method stub  
  56.                 Intent intent = new Intent();  
  57.                 intent.setAction("pause");  
  58.                 sendBroadcast(intent);  
  59.             }  
  60.         });  
  61.           
  62.     }  
  63.       
  64.     class MyBroadCast extends BroadcastReceiver{  
  65.         @Override  
  66.         public void onReceive(Context context, Intent intent) {  
  67.             // TODO Auto-generated method stub  
  68.             int s = intent.getIntExtra("key",0);  
  69.               
  70.             TextView text1 = (TextView) findViewById(R.id.text1);  
  71.             text1.setText("计时: "+s+"秒");  
  72.               
  73.         }  
  74.     }  
  75. }  

 

2、MySevice 端

       具体实现计时服务,与广播的接受与发送,具体代码如下:

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. package cn.com.qiang.timeservice;  
  2.   
  3. import android.app.Service;  
  4. import android.content.BroadcastReceiver;  
  5. import android.content.Context;  
  6. import android.content.Intent;  
  7. import android.content.IntentFilter;  
  8. import android.os.IBinder;  
  9.   
  10. public class MyService extends Service {  
  11.   
  12.     @Override  
  13.     public IBinder onBind(Intent intent) {  
  14.         // TODO Auto-generated method stub  
  15.         return null;  
  16.     }  
  17.     boolean flag;  
  18.     private Thread mythread;  
  19.     private int count;  
  20.       
  21.     @Override  
  22.     public void onCreate() {  
  23.         // TODO Auto-generated method stub  
  24.         super.onCreate();  
  25.         IntentFilter myfilter = new IntentFilter();  
  26.         myfilter.addAction("pause");  
  27.         Pause pause = new Pause();  
  28.         registerReceiver(pause,myfilter);  
  29.     }  
  30.       
  31.     @Override  
  32.     public void onStart(Intent intent, int startId) {  
  33.         // TODO Auto-generated method stub  
  34.         super.onStart(intent, startId);  
  35.         mythread = new MyThread();  
  36.         mythread.start();  
  37.     }  
  38.       
  39.     @Override  
  40.     public void onDestroy() {  
  41.         // TODO Auto-generated method stub  
  42.         super.onDestroy();  
  43.         ((MyThread) mythread).setflag();  
  44.     }  
  45.       
  46.     class Pause extends BroadcastReceiver{  
  47.         @Override  
  48.         public void onReceive(Context context, Intent intent) {  
  49.             // TODO Auto-generated method stub  
  50.             flag = true;  
  51.         }  
  52.     }  
  53.       
  54.     class MyThread extends Thread{  
  55.           
  56.   
  57.         @Override  
  58.         public void run() {  
  59.             // TODO Auto-generated method stub  
  60.             super.run();  
  61.             flag = false;  
  62.             while(!flag){  
  63.                 try {  
  64.                     Thread.sleep(1000);  
  65.                 } catch (Exception e) {  
  66.                     // TODO: handle exception  
  67.                 }  
  68.             //  Log.v("MainActivity", "计时"+(++count)+"秒");  
  69.                 Intent intent = new Intent();  
  70.                 intent.setAction("time");  
  71.                 intent.putExtra("key", ++count);  
  72.                 sendBroadcast(intent);  
  73.               
  74.             }  
  75.         }  
  76.           
  77.         public void setflag(){  
  78.             flag = true;  
  79.         }  
  80.     }  
  81.   
  82. }  

 

3、AndroidManiTest 端就不写了,该注册的注册就可以了;

 

附:在活动中使用Toast

        Toast 是Android 系统提供的一种非常好的提醒方式,在程序中可以使用它将一些短小的信息通知给用户,这些信息会在一段时间后自动消失,并且不会占用任何屏幕空间,我们现在就尝试一下如何在活动中使用Toast。

        首先需要定义一个弹出Toast 的触发点,正好界面上有个按钮,那我们就让点击这个按钮的时候弹出一个Toast 吧。在onCreate()方法中添加代码:

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. protected void onCreate(Bundle savedInstanceState) {  
  2.     super.onCreate(savedInstanceState);  
  3.     requestWindowFeature(Window.FEATURE_NO_TITLE);  
  4.     setContentView(R.layout.first_layout);  
  5.     Button button1 = (Button) findViewById(R.id.button_1);  
  6.     button1.setOnClickListener(new OnClickListener() {  
  7.         @Override  
  8.         public void onClick(View v) {  
  9.             Toast.makeText(FirstActivity.this"You clicked Button 1",  
  10.                 Toast.LENGTH_SHORT).show();  
  11.         }  
  12.     });  
  13. }  

       在活动中,可以通过findViewById()方法获取到在布局文件中定义的元素,这里我们传入R.id.button_1,来得到按钮的实例,这个值是刚才在first_layout.xml 中通过android:id 属性指定的。findViewById()方法返回的是一个View 对象,我们需要向下转型将它转成Button对象。得到了按钮的实例之后,我们通过调用setOnClickListener()方法为按钮注册一个监听器,点击按钮时就会执行监听器中的onClick()方法。因此,弹出Toast 的功能当然是要在onClick()方法中编写了。

      Toast 的用法非常简单,通过静态方法makeText()创建出一个Toast 对象,然后调用show()将Toast 显示出来就可以了。这里需要注意的是,makeText()方法需要传入三个参数。第一个参数是Context,也就是Toast 要求的上下文,由于活动本身就是一个Context 对象,因此这里直接传入FirstActivity.this即可。第二个参数是Toast显示的文本内容,第三个参数是Toast显示的时长,有两个内置常量可以选择Toast.LENGTH_SHORT 和Toast.LENGTH_LONG。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401972.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 基础 —— 活动的生存周期

一、返回栈 Android 中的活动是可以层叠的。我们每启动一个新的活动&#xff0c;就会覆盖在原活动之上&#xff0c;然后点击Back 键会销毁最上面的活动&#xff0c;下面的一个活动就会重新显示出来。 其实Android 是使用任务&#xff08;Task&#xff09;来管理活动的&#xff…

产品经理做市场调研和数据分析的方法

产品经理&#xff0c;你对用户的需求了解多少呢&#xff1f;你知道用户想要什么样的产品吗&#xff1f;你想知道用户将会如何看待你的产品吗&#xff1f;你想知道你设计的产品在用户中的口碑如何吗&#xff1f; 是 的。每一个产品经理都希望在产品开始立项设计前&#xff0c;得…

Android 基础 —— 活动的启动模式

活动的启动模式来说应该是个全新的概念&#xff0c;在实际项目中我们应该根据特定的需求为每个活动指定恰当的启动模式。启动模式一共有四种&#xff0c;分别是standard、singleTop、singleTask 和singleInstance &#xff0c; 可以在AndroidManifest.xml 中通过给<activity…

Android 四大组件 —— 服务

一、服务是什么 服务&#xff08;Service&#xff09;是Android 中实现程序后台运行的解决方案&#xff0c;它非常适合用于去执行那些不需要和用户交互而且还要求长期运行的任务。服务的运行不依赖于任何用户界面&#xff0c;即使当程序被切换到后台&#xff0c;或者用户打开了…

Highlighting System

Highlighting System 法线贴图漫反射着色器 Unity论坛&#xff1a;http://forum.unity3d.com/threads/143043-Highlighting-System-Released 需要条件 Requires Unity 3.5.6 or higher.This package requires Unity Pro, as it uses post-processing!Now supports Unity iOS Pr…

Android 基础 —— 模拟实现拨打电话功能

前面已经学习活动的显示跳转及隐式跳转&#xff0c;也学习 TextView 及 Button 两个控件的使用&#xff0c;下面我们来学习 EditText的使用&#xff1a; EditText 是程序用于和用户进行交互的另一个重要控件&#xff0c;它允许用户在控件里输入和编辑内容&#xff0c;并可以在程…

Android 四大组件 —— 活动(活动的隐式跳转)

上一篇我们讨论了活动的显示跳转&#xff0c;现在来学习活动的隐式跳转 相比于显式Intent&#xff0c;隐式Intent 则含蓄了许多&#xff0c;它并不明确指出我们想要启动哪一个活动&#xff0c;而是指定了一系列更为抽象的action 和category 等信息&#xff0c;然后交由系统去分…

ALAssetsLibrary-代码操作iOS相册资源

2019独角兽企业重金招聘Python工程师标准>>> 在iOS中&#xff0c;我们调用摄像头和选择相册中的资源&#xff0c;我们可以使用&#xff1a;UIImagePickerController类来完成。 当然&#xff0c;我们也可以不使用UI的形式来访问iOS设备的相册资源。 那就是使用&#…

Android 四大组件 —— 活动(使用Intent 实现活动的显示跳转)

一、什么是Intent&#xff1f;Intent的中文意思是目的。在Android中也是“目的”的意思。就是我们要去哪里&#xff0c;从这个activity要前往另一个Activity就需要用到Intent。 下面是 Intent 两个最基本的函数&#xff1a; 1、定义一个Intent [java] view plaincopy Intent in…

Android 项目在Eclipse中的目录结构

Android工程目录 如果使用Eclipse插件ADT开发应用程序&#xff0c;必须要熟悉工程的目录结构&#xff0c;清楚各个目录下面放置的是什么东西。Android工程主要的目录有&#xff1a;src、bin、gen、res等。 不同的Android平台目录结构是不同的&#xff0c;下面以Android 2.3.…

Exynos4412 Uboot 编译工具 —— 交叉工具链 arm-linux-gcc 的安装

一、什么是交叉编译&#xff1f; 在开发主机运行编译器编译内核、应用程序。内核和程序在目标机上运行&#xff0c;这个编译过程被称为交叉编译。编译器运行在开发主机&#xff08;通常是X86体系的PC机&#xff09;上&#xff0c;编译出的的代码是目标机体系结构的&#xff0c;…

Linux学习之CentOS(一)--CentOS6.4环境搭建

一、前言作为一个想从事j2ee后台开发的程序猿&#xff0c;linux系统怎能不学呢&#xff1f;所以&#xff0c;这几天自己准备学习一下linux操作系统。废话不多说&#xff0c;直奔主题。要学linux开发&#xff0c;首先得要安装linux系统吧&#xff0c;这里我在选择之前也挺迷茫&a…

内联函数 —— C 中关键字 inline 用法解析

一、什么是内联函数 在C语言中&#xff0c;如果一些函数被频繁调用&#xff0c;不断地有函数入栈&#xff0c;即函数栈&#xff0c;会造成栈空间或栈内存的大量消耗。 为了解决这个问题&#xff0c;特别的引入了inline修饰符&#xff0c;表示为内联函数。 栈空间就是指放置程式…

eclipse maven scm

http://my.oschina.net/OutOfMemory/blog/178512 1.安装eclipse的maven插件 m2e(http://wiki.eclipse.org/M2E_updatesite_and_gittags)Help->Install New Software...在work with中填入我们需要安装m2e的版本url&#xff1a;http://download.eclipse.org/technology/m2e/…

DS18B20 驱动编写

嵌入式开发平台&#xff1a;mini2440 DS18B20 所用GPIO&#xff1a;S3C2410_GPF(3) 一、DS18B20 时序分析 DS18B20的一线工作协议流程是&#xff1a;初始化→ROM操作指令→存储器操作指令→数据传输&#xff0c;其工作时序包括&#xff1a;初始化时序、写时序、读时序。 1、初…

Android 自定义View实现画背景和前景(ViewGroup篇)

2019独角兽企业重金招聘Python工程师标准>>> 在定义ListView的Selector时候&#xff0c;有个drawSelectorOnTop的属性&#xff0c;如果drawSelectorOnTop为true的话&#xff0c;Selector的效果是画在List Item的上面&#xff08;Selector是盖住了ListView的文字或者…

Linux的mmap内存映射机制解析

在讲述文件映射的概念时,不可避免的要牵涉到虚存(SVR 4的VM).实际上,文件映射是虚存的中心概念, 文件映射一方面给用户提供了一组措施,好似用户将文件映射到自己地址空间的某个部分,使用简单的内存访问指令读写文件&#xff1b;另一方面,它也可以用于内核的基本组织模式,在这种…

svn add Default@2x.png的文件含有@的文件名注意事项

为什么80%的码农都做不了架构师&#xff1f;>>> iOS的Icon里面&#xff0c;包含符号 &#xff0c;svn add Icon2x.png&#xff0c;没法加进去。 解决的办法是&#xff0c;在文件名最后加一个&#xff0c;例如 svn add Icon2x.png 或者svn add Icon\2x.png\ 转载于…

Linux 设备驱动的固件加载

作为一个驱动作者, 你可能发现你面对一个设备必须在它能支持工作前下载固件到它里面. 硬件市场的许多地方的竞争是如此得强烈, 以至于甚至一点用作设备控制固件的 EEPROM 的成本制造商都不愿意花费. 因此固件发布在随硬件一起的一张 CD 上, 并且操作系统负责传送固件到设备自身…

Linux USB 驱动开发(二)—— USB 驱动几个重要数据结构

前面我们学习了USB 驱动的一个描述符&#xff0c;下面来学习 USB 驱动的几个重要数据结构 一、struct usb_interface 接口函数 [cpp] view plaincopy struct usb_interface { struct usb_host_interface *altsetting; struct usb_host…