標籤:
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);
}
});
}
}
Android 四大組件之service與Broadcast