androidService简单例子

androidService简单例⼦
⾸先在实例之前先看下service的概念⽤途以及⽣命周期:
Service概念及⽤途:
Android中的服务,它与Activity不同,它是不能与⽤户交互的,不能⾃⼰启动的,运⾏在后台的程序,如果我们退出应⽤时,Service进程并没有结束,它仍然在后台运⾏,那我们什么时候会⽤到Service呢?⽐如我们播放⾳乐的时候,有可能想边听⾳乐边⼲些其他事情,当我们退出播放⾳乐的应⽤,如果不⽤Service,我们就听不到歌了,所以这时候就得⽤到Service了,⼜⽐如当我们⼀个应⽤的数据是通过⽹络获取的,不同时间(⼀段时间)的数据是不同的这时候我们可以⽤Service在后台定时更新,⽽不⽤每打开应⽤的时候在去获取。
注意:
1.Service不能⾃⼰运⾏,需要通过某⼀个Activity或者其他Context对象来调⽤, Context.startService()和Context.bindService()。
通过startService:
Service会经历 onCreate -> onStart, stopService的时候直接onDestroy,如果是调⽤者⾃⼰直接退出⽽没有调⽤stopService的话,Service会⼀直在后台运⾏。下次调⽤者再起来可以stopService。
通过bindService:
Service只会运⾏onCreate,这个时候调⽤者和Service绑定在⼀起,调⽤者退出了,Srevice就会调⽤onUnbind->onDestroyed所谓绑定在⼀起就共存亡了。
Service的onCreate的⽅法只会被调⽤⼀次,就是你⽆论多少次的startService⼜bindService,Service只被创建⼀次。如果先是bind了,那么start的时候
就直接运⾏Service的onStart⽅法,如果先是start,那么bind的时候就直接运⾏onBind⽅法。如果你先bind上了,就stop不掉了,对啊,就是stopService不好了,
只能先UnbindService, 再StopService,所以是先start还是先bind⾏为是有区别的.
2.Service是跑在主线程中,如果在service的onCreate或onStart⽅法中有耗时操作,需要放到单独的线程中,否则会影响到UI操作或者阻塞主线程中的其他事情或者抛出ANR异常. Service⽣命周期 :
Android Service的⽣命周期并不像Activity那么复杂,它只继承了onCreate(),onStart(),onDestroy()三个⽅法,当我们第⼀次启动Service时,先后调⽤了
onCreate(),onStart()这两个⽅法,当停⽌Service时,则执⾏onDestroy()⽅法,这⾥需要注意的是,如果Service已经启动了,当我们再次启动Service时,
不会在执⾏onCreate()⽅法,⽽是直接执⾏onStart()⽅法
Service与Activity通信:
Service后端的数据最终还是要呈现在前端Activity之上的,因为启动Service时,系统会重新开启⼀个新的进程,这就涉及到不同进程间通信的问题了(AIDL),
当我们想获取启动的Service实例时,我们可以⽤到bindService和onBindService⽅法,它们分别执⾏了Service中IBinder()和onUnbind()⽅法。
通常每个应⽤程序都在它⾃⼰的进程内运⾏,但有时需要在进程间传递对象,你可以通过应⽤程序UI的⽅式写个运⾏在⼀个不同的进程中的service。
在android平台中,⼀个进程通常不能访问其他进程中的内存区域。所以,他们需要把对象拆分成操作系统能理解的简单形式,以便伪装成对象跨越边界访问。
编写这种伪装代码相当的枯燥乏味,好在android为我们提供了AIDL⼯具可以来做这件事。
AIDL与Service
AIDL是⼀个IDL语⾔,它可以⽣成⼀段代码,可以使在⼀个android设备上运⾏的两个进程使⽤内部通信进程进⾏交互。如果你需要在⼀个进程中
(例如:在**⼀个Activity中)访问另⼀个进程中(例如:⼀个Service)某个对象的⽅法,你就可以使⽤AIDL来⽣成这样的代码来伪装传递各种参数。
要使⽤AIDL,Service需要以aidl⽂件的⽅式提供服务接⼝,AIDL⼯具将⽣成⼀个相应的java接⼝,并且在⽣成的服务接⼝中包含⼀个功能调⽤的stub服务桩类。
Service的实现类需要去继承这个stub服务桩类。Service的onBind⽅法会返回实现类的对象,之后你就可以使⽤它了
以下是⼀个Service的实例:
xml⽂件:
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:id="@+id/text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<Button
android:id="@+id/startservice"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="startService"
/>
<Button
android:id="@+id/stopservice"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="stopService"
/>
<Button
android:id="@+id/bindservice"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="bindService"
/>
<Button
android:id="@+id/unbindservice"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="unbindService"
/>
</LinearLayout>
Service代码:
import android.app.Service;
t.Intent;
import android.os.Binder;
import android.os.IBinder;
format.Time;
import android.util.Log;
public class OutService extends Service {
//定义个⼀个Tag标签
private static final String TAG = "OutService";
//这⾥定义吧⼀个Binder类,⽤在onBind()有⽅法⾥,这样Activity那边可以获取到private MyBinder mBinder = new MyBinder();
private OutServiceAIDL.Stub aBinder = new OutServiceAIDL.Stub(){
      @Override
      public String getSystemTime() throws RemoteException {
Time t = new Time();
t.setToNow();
String()+" ------>aidl";
}
};
@Override
public IBinder onBind(Intent intent) {
Log.e(TAG, "start IBinder~~~");
/
/return mBinder;    //未使⽤aidl
return aBinder;      //使⽤aidl
}
@Override
public void onCreate() {
Log.e(TAG, "start onCreate~~~");
}
@Override
public void onStart(Intent intent, int startId) {
Log.e(TAG, "start onStart~~~");
}
@Override
public void onDestroy() {
Log.e(TAG, "start onDestroy~~~");
@Override
public boolean onUnbind(Intent intent) {
Log.e(TAG, "start onUnbind~~~");
Unbind(intent);
}
/
/这⾥我写了⼀个获取当前时间的函数,不过没有格式化就先这么着吧
public String getSystemTime(){
Time t = new Time();
t.setToNow();
String();
}
public class MyBinder extends Binder{
MyService getService()
{冷冻机油基础油
return MyService.this;
}
}
}
Activity代码:
猪食槽import android.app.Activity;
t.ComponentName;
t.Context;
t.Intent;
t.ServiceConnection;
import android.os.Bundle;
数控分度头import android.os.IBinder;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class ServiceDemo extends Activity implements OnClickListener{
private MyService  mMyService;
private OutServiceAIDL aService;
private TextView mTextView;
private Button startServiceButton;
private Button stopServiceButton;
private Button bindServiceButton;
private Button unbindServiceButton;
帷幕灌浆
private Context mContext;
//这⾥需要⽤到ServiceConnection在Context.bindService和context.unBindService()⾥⽤到private ServiceConnection mServiceConnection = new ServiceConnection() {
10.8.0.254
//当我bindService时,让TextView显⽰MyService⾥getSystemTime()⽅法的返回值
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
//mMyService = ((MyService.MyBinder)service).getService();
//mTextView.setText("I am frome Service :" + SystemTime());
aService = OutServiceAIDL.Stub.asInterface(service);
try {
mTextView.setText("I am frome Service aidl:" + SystemTime());
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
};
public void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.main);
setupViews();
}
public void setupViews(){
mContext = ServiceDemo.this;
mTextView = (TextView)findViewById();
startServiceButton = (Button)findViewById(R.id.startservice);
stopServiceButton = (Button)findViewById(R.id.stopservice);
bindServiceButton = (Button)findViewById(R.id.bindservice);
unbindServiceButton = (Button)findViewById(R.id.unbindservice);
startServiceButton.setOnClickListener(this);
stopServiceButton.setOnClickListener(this);
bindServiceButton.setOnClickListener(this);
unbindServiceButton.setOnClickListener(this);
}
乳胶片
public void onClick(View v) {
// TODO Auto-generated method stub
if(v == startServiceButton){
Intent i  = new Intent();
i.setClass(ServiceDemo.this, MyService.class);
mContext.startService(i);
}else if(v == stopServiceButton){
Intent i  = new Intent();
i.setClass(ServiceDemo.this, MyService.class);
mContext.stopService(i);
}else if(v == bindServiceButton){
Intent i  = new Intent();
i.setClass(ServiceDemo.this, MyService.class);
mContext.bindService(i, mServiceConnection, BIND_AUTO_CREATE);          }else{
mContext.unbindService(mServiceConnection);
}
}
}
aidl⽂件:
interface OutServiceAIDL {
String getSystemTime();
}

本文发布于:2024-09-22 08:31:21,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/277052.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:进程   需要   对象   获取   操作   访问   时候   退出
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议