//当接受到广播该方法调用
@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生命周期的影响是不一样的。
1 通过startService
Service会经历 onCreate -> onStart
stopService的时候直接onDestroy
如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。下次调用者再起来可以stopService。
2 通过bindService
Service只会运行onCreate, 这个时候服务的调用者和服务绑定在一起
调用者退出了,Srevice就会调用onUnbind->onDestroyed所谓绑定在一起就共存亡了。并且这种方式还可以使得
调用方(例如)调用服务上的其他的方法。