Android 四大组件之service与Broadcast

一年好景君须记,最是橙黄橘绿时。这篇文章主要讲述Android 四大组件之service与Broadcast相关的知识,希望能为你提供帮助。
【Android 四大组件之service与Broadcast】android 四大组件之一:service:

Service有五个生命周期:onCreat,onStartCommand, onBind,onUnbind, onDestroy

主要有绑定和非绑定两种方式
首相在Activity中设置四个Button,用于测试绑定和非绑定两种方式,按下Button播放音乐,停止音乐,非绑定用StopService停止,绑定方式用Bind Service启动,解绑用unbindService停止。

非绑定:Intent intent=new Intent(MainActivity.this,MyService.class);

start Service(intent); /stopSercice(intent)

从Activity启动service主要用上述代码,

 

绑定:Intentintent=newIntent(MainActivity.this,MyService.class);

bindService(intent,serviceConnection,BIND_AUTO_CREATE);

serviceConnection为:

private ServiceConnection serviceConnection=new ServiceConnection() {
      @Override
      public void onServiceConnected(ComponentName name,
                                                                    IBinder service) {
        myService=((MyService.MyBinder)service).getService();
      }

      @Override
      public void onServiceDisconnected(ComponentName name) {

      }
};

绑定写法为固定写法

在Service中还可以使用函数回调的方式来进行某些操作

函数回调一般有四个步骤:

1. 定义一个借口,借口里定义一个方法

2. Activity中实现这个借口,和借口里的方法

3.Service中定义public static void setMusicStop(Context context){
      stopImg = (StopImg) context;
}

4.在Activity中传入作用域就能够调用Service中的方法。

函数回调一般分为这四个步骤。

函数回调不仅用于Activity与Service中,还可以用于Activity与Activity中。

音乐播放器中一般用到函数回调。

 

 

Broadcast:广播

注册方法非为静态、动态两种方式

静态即在清单文件中手动注册

< receiver
      android:name=".Broadcast.MySMS"
      android:enabled="true"
      android:exported="true">
      < intent-filter>
              < action android:name="android.provider.Telephony.SMS_RECEIVED" />
      < /intent-filter>
< /receiver>

其中的android:name="android.provider.Telephony.SMS_RECEIVED"

为自己定义的名称

 

动态注册:

//动态注册广播
IntentFilter intent Filter=new IntentFilter();
intentFilter.addAction("android.jredu.action.WEN");
registerReceiver(new MyactiveBroad(),intentFilter);

 

 

 

public class MyactiveBroad extends BroadcastReceiver{

      @Override
      public void onReceive(Context context, Intent intent) {
              String arg2 = intent.getStringExtra("arg2");
              Log.d("===========接受======",arg2);
      }
}

广播注册完成后,还要下一个继承BroadcastReceiver的方法,用于接收广播的内容,想要在哪接收广播,就要在哪注册广播。

 

下面写一个广播的测试程序来说明:用到之前说的Service

 

首先,建立一个Activity1,设置两个Button,

一个测试静态注册,一个用于跳转测试动态注册。

再建立一个Service,静态注册,

 

 

在Service清单文件中,加入

< receiver
      android:name=".Broadcast.MyReceiver"
      android:enabled="true"
      android:exported="true">
      < intent-filter>
              < action android:name="android.jredu.broadcast.ZHANG" />
      < /intent-filter>
< /receiver>

这就静态注册了一个广播,广播的name为

< action android:name="android.jredu.broadcast.ZHANG" />

再建立一个Activity2,测试动态发送。

 

 

下为Activity1的内容

public class BroadcastActivity extends AppCompatActivity {
      private Button bt1,bt2;
      @Override
      protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_broadcast);
              bt1= (Button) findViewById(R.id.bt1);
              bt2= (Button) findViewById(R.id.bt2);
              bt1.setOnClickListener(new View.OnClickListener() {
                      @Override
                      public void onClick(View v) {
                              Intent intent=new Intent();
                              intent.putExtra("arg","你好");
                              intent.setAction("android.jredu.broadcast.ZHANG");
                              sendBroadcast(intent);
                      }
              });
              bt2.setOnClickListener(new View.OnClickListener() {
                      @Override
                      public void onClick(View v) {
                              Intent intent=new Intent(getBaseContext(),BroadActivity.class);
                              startActivity(intent);
                      }
              });
              //动态注册广播
             
IntentFilter intentFilter=new IntentFilter();
              intentFilter.addAction("android.jredu.action.WEN");
              registerReceiver(new MyactiveBroad(),intentFilter);

      }
      public class MyactiveBroad extends BroadcastReceiver{

              @Override
              public void onReceive(Context context, Intent intent) {
                      String arg2 = intent.getStringExtra("arg2");
                      Log.d("===========接受======",arg2);
              }
      }
}

 

下为Activity2的内容:中有一个Button,按下发送广播

public class BroadActivity extends AppCompatActivity {
      private Button bt1;
      @Override
      protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_broad);
              bt1= (Button) findViewById(R.id.bt1);
              bt1.setOnClickListener(new View.OnClickListener() {
                      @Override
                      public void onClick(View v) {
                              Intent intent=new Intent();
                              intent.putExtra("arg2","42870");
                              intent.setAction("android.jredu.action.WEN");
                              sendBroadcast(intent);
                      }
              });
      }
}


    推荐阅读