Android笔记——Day6 *Service初步 *利用序列化在Activity之间交换数据
程序员文章站
2022-03-30 09:01:16
...
昨天貌似ITEYE用CSDN的号登不上去,博客没法写了,现在又好了--#
1、Service初步
参考http://www.cnblogs.com/newcj/archive/2011/05/30/2061370.html
••Activity是前台,有界面;Service是后台,*面。
••Android中实现Service一般有两种方式:
1) 直接调用startService()启动一个Service;
*1、定义一个继承Service的子类并覆写其中的onBind(),onCreate等方法;
public class myService extends Service{
@Override
public IBinder onBind(Intent arg0) {
Log.e("SERVICE","service onBind");
return data;
}
@Override
public void onCreate(){
super.onCreate();
Log.e("SERVICE","serice created");
new Thread(){
public void run(){
//比较好的是启动一个新的线程
}
}.start();
}
@Override //按理override可写可不写,貌似我没写就不运行onDestory()函数了--#
public void onDestroy()
{
super.onDestroy();
}
public boolean onUnbind(Intent intent){
super.onUnbind(intent);
return true;
}
}
注意该Service的生命周期为:
onCreate()->onStartCommand()->onDestory()
由于该Service并不是由绑定生成的,如果不执行stopService()函数,即使改程序退出了, Service仍然存在。
*2、在AndroidManifest.xml文件中配置该Service;
<service android:name=".myService"> <intent-filter> <action android:name="com.seu.myService.ACCOUNT_SERVICE"/> </intent-filter> </service>
*3、利用Intent对象启动该Service;
Intent intent = new Intent(); intent.setAction("com.seu.myService.ACCOUNT_SERVICE");
startService(intent);//启动一个Service;
stopService(intent); //停止一个Service;
2绑定本地Service并与之通信。
利用该方法启动Service可以比较方便的在Service和Activity之间进行数据交换。
*1、自定义一个继承Service的子类,并根据需求定义一个继承Binder的内部类;重写 onBind()方法并返回该Binder子类对象。
public class myService extends Service{
private int count = 0;
MyBinder data = new MyBinder();//定义一个Binder子类对象
public class MyBinder extends Binder
{
public int getcount(){
return count;
}
}
@Override
public IBinder onBind(Intent arg0) {
Log.e("SERVICE","service onBind");
return data; //绑定时会将data返回给ServiceConntected对象中的onServiceconntected函数参数。
}
public void onCreate(){
super.onCreate();
Log.e("SERVICE","serice created");
new Thread(){
public void run(){
while(count<=1000){
count++;
try{
Thread.sleep(1000);
}catch (Exception e) {
// TODO: handle exception
}
}
}
}.start();
}
@Override
public void onDestroy()
{
super.onDestroy();
Log.e("SERVICE","Service is Destroyed");
}
public boolean onUnbind(Intent intent){
super.onUnbind(intent);
Log.e("SERVICE","unBinded");
return true;
}
}
*2、配置AndroidManifest.xml文件。
<service
android:name=".myService">
<intent-filter>
<action android:name="com.seu.myService.ACCOUNT_SERVICE"/>
</intent-filter>
</service>
*3、在Activity中定义一个ServiceConntected对象,调用bindService()函数绑定一个Service并启动,调用unBindService()函数解除绑定。
public class FirstServiceActivity extends Activity {
myService.MyBinder BI = null;
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
Log.e("SERVICE","service disconnected");
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) { //Service中的data作为IBinder参数传递进来进而进行数据交流。
// TODO Auto-generated method stub
Log.e("SERVICE","service connected");
BI =(myService.MyBinder)service;
}
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button start , stop , print;
start = (Button)findViewById(R.id.start);
stop = (Button)findViewById(R.id.stop);
print = (Button)findViewById(R.id.print);
final Intent intent = new Intent();
intent.setAction("com.seu.myService.ACCOUNT_SERVICE");
start.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
bindService(intent , conn , Service.BIND_AUTO_CREATE);
//启动该Service
}
});
stop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
unbindService(conn);
//解除绑定
}
});
print.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.e("SERVICE",BI.getcount()+" ");
// TODO Auto-generated method stub
}
});
}
}
//比较好的习惯是在Activity的onDestory()函数中进行Service的解除绑定工作
该方法中Service的生命周期:
onCreate()->onBind()->onUnbind()->onDestory()
2、 利用序列化在Activity之间交换数据
••我觉得利用序列化在Activity之间进行数据交换真的是一个比较方便的方法。
••具体步骤如下
1) 将需要进行交换的类实现Serializable接口
public class suibian implements Serializable{
private int name = 1;
public void changename(int o){
name = o;
}
public int getname(){
return name;
}
//需要注意的是如果该类中有某类的对象,那么该类也必须先实现Serializable接口
2)直接用Intent对象的putExtra()方法放入对象。
public class SerActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button next = (Button)findViewById(R.id.next);
next.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
suibian sss = new suibian();
sss.changename(100);
Intent intent = new Intent();
intent.setClass(SerActivity.this, second.class);
intent.putExtra("suibian", sss);
startActivity(intent);
// TODO Auto-generated method stub
}
});
}
}
3)用另一个Activity中getIntent()得到的Intent执行getSerializableExtra()方法得到该对象。
public class second extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
suibian sss = null;
setContentView(R.layout.second);
Intent intent = getIntent();
sss =(suibian)intent.getSerializableExtra("suibian");
Log.e("SSS",""+sss.getname());//测试成功
}
}
3、Spinner控件
本来是想写Spinner控件的使用方法的,后来一想控件种类太多,就算是写了博客也是记不下来的,还是等用到的时候查看帮助文档或是网上查看相关资料辅助编程吧。--#
上一篇: Vue中的watch监听