android之广播

来源:互联网 发布:美国的排外知乎 编辑:程序博客网 时间:2024/05/20 05:54
public class MyBroadcastReceiver extends BroadcastReceiver {


//当接受到广播该方法调用
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub


if(intent.getAction().equals("com.itcast.action.wuhan")){
String name = intent.getStringExtra("name");
System.out.println(name+"我在东莞哦");
}

}


}


两种注册方式:

一:

<receiver 
            android:name="com.itcast.mybroadcast.MyBroadcastReceiver">
            <intent-filter >
                <action android:name="com.itcast.action.wuhan"/>
            </intent-filter>
</receiver>


//订阅广播

二:

MyBroadcastReceiver receiver = new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("com.itcast.action.wuhan");
registerReceiver(receiver, filter);


public void send(View v){
//发送广播
Intent intent = new Intent();
intent.setAction("com.itcast.action.wuhan");
intent.putExtra("name", "陈龙");
sendBroadcast(intent);
}


---------------------------------------------

订阅短信到来广播:

public class SmsReceiver extends BroadcastReceiver {


@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub


System.out.println("我可以接受广播");
Object[] pdus =  (Object[]) intent.getExtras().get("pdus");
for(Object pdu:pdus){
byte[] sms = (byte[]) pdu;//短信数据  --》短信对象
SmsMessage smsMessage = SmsMessage.createFromPdu(sms);
//内容
String body = smsMessage.getDisplayMessageBody();
//地址
String address = smsMessage.getDisplayOriginatingAddress();
//时间
long millis = smsMessage.getTimestampMillis();

//格式化时间
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String dateStr = format.format(millis);

System.out.println("body:"+body);
System.out.println("address:"+address);
System.out.println("dateStr:"+dateStr);

//中断广播
abortBroadcast();
}
}


}

<receiver android:name="com.itcast.smsreceiver.SmsReceiver">
            <intent-filter android:priority="1000">
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
            </intent-filter>
        </receiver>

-------------------------------------------------

有了 Service 类我们如何启动他呢,有两种方法:

      • Context.startService() 
      • Context.bindService()


     1.  在同一个应用任何地方调用 startService() 方法就能启动 Service 了,然后系统会回调 Service 类的 onCreate() 以及 onStart() 方法。这样启动的 Service 会一直运行在后台,直到 Context.stopService() 或者 selfStop() 方法被调用。另外如果一个 Service 已经被启动,其他代码再试图调用 startService() 方法,是不会执行 onCreate() 的,但会重新执行一次 onStart() 。

      2. 另外一种 bindService() 方法的意思是,把这个 Service 和调用 Service 的客户类绑起来,如果调用这个客户类被销毁,Service 也会被销毁。用这个方法的一个好处是,bindService() 方法执行后 Service 会回调上边提到的 onBind() 方发,你可以从这里返回一个实现了 IBind 接口的类,在客户端操作这个类就能和这个服务通信了,比如得到 Service 运行的状态或其他操作。如果 Service 还没有运行,使用这个方法启动 Service 就会 onCreate() 方法而不会调用 onStart()。

     

      总结:

      1. startService()的目的是回调onStart()方法,onCreate() 方法是在Service不存在的时候调用的,如果Service存在(例如之前调用了bindService,那么Service的onCreate方法已经调用了)那么startService()将跳过onCreate() 方法。

      2.  bindService()目的是回调onBind()方法,它的作用是在Service和调用者之间建立一个桥梁,并不负责更多的工作(例如一个Service需要连接服务器的操作),一般使用bindService来绑定到一个现有的Service(即通过StartService启动的服务)。

      由于Service 的onStart()方法只有在startService()启动Service的情况下才调用,故使用onStart()的时候要注意这点。

Service的生命周期方法onCreate, onStart, onDestroy
有两种方式启动一个Service,他们对Service生命周期的影响是不一样的。

通过startService

  Service会经历 onCreate -> onStart
 stopService的时候直接
onDestroy
  如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。下次调用者再起来可以stopService

通过bindService

  Service只会运行onCreate, 这个时候服务的调用者和服务绑定在一起

  调用者退出了,Srevice就会调用onUnbind->onDestroyed所谓绑定在一起就共存亡了。并且这种方式还可以使得 

调用方(例如)调用服务上的其他的方法。



0 0
原创粉丝点击