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); } }); } }
时间: 2024-12-26 08:57:12