利用廣播調用服務里面的方法,間接的方式調用服務內部的方法,與現實中差不多,請媒體曝光
主界面里面
在界面創建的時候開啟一下服務普通的startService()方法
發送一條廣播出去
獲取Intent對象,通過new出來
調用Intent對象的setAction()方法,參數:一般就是包名
調用sendBroadcast(intebt)方法,發送廣播,參數:Intent對象
服務里面
新建一個MyService類繼承系統的Service類
添加一個自定義的服務的方法callServiceMethod(),我們目的要調用的方法
新建一個內部類MyReceiver繼承系統的Receiver類
廣播接收者既能通過清單文件注冊,也可以通過代碼的方式注冊,這是四大組件中唯一的特殊的一個
在MyService中創建一個MyReceiver的成員變量
在服務創建的時候,注冊廣播接收者,在onCreate()方法里面
調用registerReceiver(receiver,filter)方法,注冊這個廣播接收者,參數:receiver是BroadcastReceiver對象,通過new MyReceiver()來創建,filter是IntentFilter對象
獲取IntentFilter對象,通過new出來
調用IntentFilter對象的addAction(action)方法,意圖過濾器對象添加監聽動作,上面發送的那個動作
當接收者收到信號的時候,會調用MyReceiver對象的onReceive()方法,在這個方法里面可以去調用服務的私有方法,比如callServiceMethod()
當服務銷毀的時候,解除注冊的廣播接收者,在onDestroy()方法里面,調用unResisterReceiver(receiver),參數:廣播接收者對象
MainActivity.java
package com.tsh.broadcallservice; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //開啟服務 Intent intent=new Intent(this,MyService.class); startService(intent); } //廣播調用服務 public void call(View v){ Intent intent=new Intent(); intent.setAction("com.tsh.broadcallservice"); sendBroadcast(intent); } }
MyService.java
package com.tsh.broadcallservice; import android.app.Service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.IBinder; import android.widget.Toast; public class MyService extends Service { private MyReceiver receiver; @Override public IBinder onBind(Intent intent) { return null; } //服務創建的時候注冊廣播接收者 @Override public void onCreate() { super.onCreate(); receiver=new MyReceiver(); IntentFilter filter=new IntentFilter(); filter.addAction("com.tsh.broadcallservice"); registerReceiver(receiver, filter); } //服務里面的一個方法 public void callServiceMethod(){ Toast.makeText(getApplicationContext(), "廣播調用服務啦", 0).show(); } //內部類實現廣播接收者 private class MyReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { callServiceMethod(); } } }