Service详解
来源:互联网 发布:node strict 编辑:程序博客网 时间:2024/05/18 01:19
1.简介
Service运行在后台不需要依赖UI,但是依然在主线程中。
2.使用注意
2.1 startService()
startService, Service类执行方法: onCreate(),onStartCommand().
再次调用startService, 只会执行onStartCommand(). 因为onCreate()只会在Service创建的时候执行一次。每次调用 startService,都会执行onStartCommand().
stopService, Service类执行方法:onDestroy()。
我们应该始终记得在Service的onDestroy()方法里去清理掉那些不再使用的资源,防止在Service被销毁后还会有一些不再使用的对象仍占用着内存。
2.2 bindService()
bindService, Service类执行方法: onCreate(),onStartCommand().
unbindService, Service类执行方法:onDestroy().此时调用stopService()不起作用
对于startService开启的服务,调用unbindService()会让程序崩溃。
unbindService()后,再次调用unbindService(),程序会崩溃。
3.代码示例
- 模拟bindService新开线程,做一个耗时任务,发送通知给Activity,并且更新UI。
Activity类
public class ServiceActivity extends Activity implements View.OnClickListener{ private Button mBtnStopS; private Button mBtnStartS; private Button mBtnBindS; private Button mBtnUnBindS; private TextView mTvShowTest; private TestService.MyBinderTest mBinderTest; private ServiceConnection mConnection=new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { mBinderTest= (TestService.MyBinderTest)service; mBinderTest.startDownload(); } @Override public void onServiceDisconnected(ComponentName name) { } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_service); initView(); registerBroadcast(); } private void registerBroadcast() { IntentFilter filter=new IntentFilter("com.exa.test"); registerReceiver(mReceiver,filter); } private void initView() { mBtnStartS = (Button) findViewById(R.id.btn_start_service); mBtnStopS = (Button) findViewById(R.id.btn_stop_service); mBtnBindS = (Button) findViewById(R.id.btn_bind_service); mBtnUnBindS = (Button) findViewById(R.id.btn_unbind_service); mTvShowTest = (TextView) findViewById(R.id.tv_show_test); mBtnStartS.setOnClickListener(this); mBtnStopS.setOnClickListener(this); mBtnBindS.setOnClickListener(this); mBtnUnBindS.setOnClickListener(this); } @Override public void onClick(View v) { Intent intent=new Intent(ServiceActivity.this,TestService.class); switch (v.getId()){ case R.id.btn_start_service: startService(intent); break; case R.id.btn_stop_service: stopService(intent); break; case R.id.btn_bind_service: bindService(intent,mConnection, Context.BIND_AUTO_CREATE); break; case R.id.btn_unbind_service: unbindService(mConnection); break; } } private BroadcastReceiver mReceiver=new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.i("TestService","ok:"+intent.getStringExtra("msg")); mTvShowTest.setText(intent.getStringExtra("msg")+""); } }; @Override protected void onStop() { super.onStop(); } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(mReceiver); unbindService(mConnection); }}
Service类
public class TestService extends Service { private static final String TAG = TestService.class.getSimpleName(); private MyBinderTest mBinderTest=new MyBinderTest(); class MyBinderTest extends Binder{ public void startDownload(){ Log.i(TAG,"startDownload"); new Thread(new Runnable() { @Override public void run() { Log.i(TAG,"run"); Intent intent=new Intent(); intent.setAction("com.exa.test"); intent.putExtra("msg","来自TestService的消息"); sendBroadcast(intent); } }).start(); } } @Nullable @Override public IBinder onBind(Intent intent) { return mBinderTest; } @Override public void onCreate() { super.onCreate(); Log.i(TAG,"onCreate"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i(TAG,"onStartCommand"); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); Log.i(TAG,"onDestroy"); }}
0 0
- service 详解
- Service详解
- service详解
- Service 详解
- Service详解
- Service详解
- service详解
- service详解
- service详解
- Service 详解
- service详解
- Service 详解
- Service详解
- Service详解
- Service详解
- Service详解
- Service详解
- Service详解
- Idea编译器 报@Override错误
- 网上炒作的哪些日赚千元不是梦的手机赚钱项目是真的吗
- Spring boot websocket消息推送
- 浅析集合不安全例子
- MySQL事务隔离级别详解
- Service详解
- ATOM编辑器快捷键大全
- Codeforces刷题之路——58A Chat room
- Ubuntu 16.04安装Brackets 1.7失败,缺失libgcrypt11,解决办法
- GraphicsMagick性能测试(一)
- HDU 4348 SPOJ TTM To the moon(操作建树)
- linux rpm安装mysql
- x-code打开模拟器提示Developer Tools Access
- isEqualToArray