一、知識准備
①常駐廣播接受者:使用AndroidManifest.xml注冊,接受者不隨Activity的銷毀而銷毀,也就是擁有獨立的生命周期。
②非常駐廣播接受者:使用registerReceiver(receiver,intentfilter)對廣播接收者進行注冊。同事需要使用unregisterReceiver(receiver)注銷這個廣播接收者。注冊時表示創建廣播接收者,注銷時表示銷毀這個廣播接收者。生命周期由開發者決定。通常在activity的onCreate方法中創建廣播接收者,在onDestroy中銷毀廣播接收者。生命周期可控。
③建議了解http://www.cnblogs.com/xqz0618/p/msg_broadcast.html
二、項目案例一
【標題】利用非常駐廣播接受收到短信的廣播
【步驟】
①創建一個廣播NReceiver
②在Activity中進行注冊
③在Activity銷毀時注銷
【項目結構】
【NReceiver】
【MainActivity】
1 import android.Manifest; 2 import android.content.BroadcastReceiver; 3 import android.content.IntentFilter; 4 import android.content.pm.PackageManager; 5 import android.support.v4.app.ActivityCompat; 6 import android.support.v4.content.ContextCompat; 7 import android.support.v7.app.AppCompatActivity; 8 import android.os.Bundle; 9 import android.util.Log; 10
11 import com.example.administrator.myapplication.receiver.NReceiver; 12
13 public class MainActivity extends AppCompatActivity { 14
15 BroadcastReceiver receiver = null; 16
17 @Override 18 protected void onCreate(Bundle savedInstanceState) { 19 super.onCreate(savedInstanceState); 20 setContentView(R.layout.activity_main); 21 getpermission(); 22
23 registerBroadcast(); 24
25 } 26
27 private void getpermission() { 28 if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_SMS) 29 != PackageManager.PERMISSION_GRANTED||ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.RECEIVE_SMS) 30 !=PackageManager.PERMISSION_GRANTED){ 31 ActivityCompat.requestPermissions(MainActivity.this,new String[]{ 32 Manifest.permission.READ_SMS,Manifest.permission.RECEIVE_SMS 33 },1); 34 } 35 } 36
37 private void registerBroadcast() { 38 receiver = new NReceiver(); 39 IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); 40 registerReceiver(receiver,filter); 41 Log.i("TAG", "registerBroadcast: ---------register"); 42 } 43
44 @Override 45 protected void onDestroy() { 46 super.onDestroy(); 47 unregisterReceiver(receiver); 48 } 49 }
【提示】由於是要接收短信的廣播,所以需要獲取權限
【AndroidManifest】
1 <uses-permission android:name="android.permission.READ_SMS"></uses-permission>
2 <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
【提示】非常駐型廣播無需在AndroidManifest中進行注冊廣播。
【效果】
①利用模擬器開發工具模擬發送信息
②將APP完全退出,再發送信息,不再收到提示
二、項目案例二
【標題】常駐型廣播接收收到短信的廣播
【提示】再項目一得基礎上修改
【AndroidManifest】注冊
1 <receiver 2 android:name=".receiver.NReceiver"
3 android:enabled="true"
4 android:exported="true">
5 <intent-filter >
6 <action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
7 </intent-filter>
8 </receiver>
【MainActivity】
【提示】由於常駐型廣播已經在AndroidManifest注冊,則無須利用registerReceiver(receiver,intentfilter)進行注冊和銷毀。Activity中只需進行動態權限的申請
1 public class MainActivity extends AppCompatActivity { 2
3 BroadcastReceiver receiver = null; 4
5 @Override 6 protected void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.activity_main); 9 getpermission(); 10
11 } 12
13 private void getpermission() { 14 if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_SMS) 15 != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.RECEIVE_SMS) 16 != PackageManager.PERMISSION_GRANTED) { 17 ActivityCompat.requestPermissions(MainActivity.this, new String[]{ 18 Manifest.permission.READ_SMS, Manifest.permission.RECEIVE_SMS 19 }, 1); 20 } 21 } 22
23 }
【效果】