zoukankan      html  css  js  c++  java
  • android service学习

    1、要使用Service,首先就是在配置文件里吗添加Service,如果不填加,你的Service是不能够使用的。目前学到的方法有两种

       方法一:<service android:enabled="true" android:name=".PlayService" />

       方法二:<service android:name=".PlayService" />

      点后面是Service类的名字。

    2、工程包括两个类:

    ServiceActivity.java

    PlayService.java

    其中:ServiceActivity.java定义了两个按钮,分别控制音乐的播放与停止。

    用startService和stopService完成Activity与Service之间的切换,启动Service以及取消Service,

    如果不用按钮,可以在Activity的OnCreate和OnDestrpy里面启动和取消Service,如下:

    复制代码
    复制代码
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);


    this.startService(new Intent(this, PlayService.class));
    }

    @Override
    protected void onDestroy() {
    super.onDestroy();
    this.stopService(new Intent(this,PlayService.class));
    }
    复制代码
    复制代码

    在activity里面,如果需要使用Service的话,需要调用startService(),从而利用startService()去调用Service中的OnCreate()和onStart()方法来启动一个后台的Service。

    启动一个Service的过程如下:context.startService() ->onCreate()->onStart()->Servicerunning其中onCreate()可以进行一些服务的初始化工作,onStart()则启动服务。

    停止一个Service的过程如下:context.stopService() |->onDestroy() ->Service stop 

    创建Service需要继承自 android.app.Service 的类,然后重新实现在Service各个状态要回调的方法,Service的回调方法有三个,分别是:

    • onCreate()
      创建
    • onStart()
      开始
    • onDestry()
      释放

    注意:Service是不能自己启动的,只有通过 Context 对象 调用startService和bindService方法来启动。也就是说Service不能自己调用的,所以我们看见很多Service都是用Activity调用的。

    (1)Context.startService():Service会经历onCreate -> onStart(如果Service还没有运行,则android先调用onCreate()然后调用onStart();如果Service已经运行,则只调用onStart(),所以一个Service的onStart方法可能会重复调用多次);stopService的时候直接onDestroy,如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。该Service的调用者再启动起来后可以通过stopService关闭Service。 注意,多次调用Context.startservice()不会嵌套(即使会有相应的onStart()方法被调用),所以无论同一个服务被启动了多少次,一旦调用Context.stopService()或者stopSelf(),他都会被停止。补充说明:传递给startService()的Intent对象会传递给onStart()方法。调用顺序为:onCreate --> onStart(可多次调用) --> onDestroy。
    (2)Context.bindService():Service会经历onCreate() -> onBind(),onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice就会调用onUnbind -> onDestroyed相应退出,所谓绑定在一起就共存亡了
    补充说明:传递给bindService()的Intent对象会传递给onBind(),传递给unbindService()的Intent对象会传递给onUnbind()方法调用顺序为:onCreate --> onBind(只一次,不可多次绑定) --> onUnbind --> onDestory。
    (3)注意事项:在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),其他onCreate,onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。还有一点,目前我没有遇到过需要startService和bindService交互使用的情况(我认为不会有这种需求),所以不必去考虑交互的问题,待遇到时再考虑不迟。
    (4)BroadcastReceiver只能通过startService启动Service,因为广播本身生命周期很短,bind的话没有意义

    
    

    PlayService.java是Service类,

    包括OnCreate,OnStart,OnDestroy三种方法,

       其中OnCreate可有可无,如果有,可以在这里创建与MediaPlayerd的链接。如果无,可以在Onstart里面创建这个链接。

            OnCreate在音乐播放周期里面(未OnDestroy)之前,只创建一次,而每按一次播放,OnStart就会被调用一次。

            OnStart,里面可以启动播放音乐,

            OnDestroy,里面调用停止播放音乐。

    如果按了停止按钮,会调用(或者打印Log更直观)“ServiconDestroy“,但是Activity不会退出。

    当退出Activity的时候,会相继调用(或者打印Log更直观)"ActivityonStop",和"ActivityOnDestroy"此时,音乐播放是不会停止的,

    可以知道,如果想让Service一启动就执行的代码,可以写在Service的OnCreate或OnStart,里面,会在启动Service的时候自动调用,与Activity自动调用OnCreate道理是一样的。

    代码如下:

    复制代码
    代码
    package com.service.su;

    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;

    public class ServiceActivity extends Activity implements OnClickListener {
    /** Called when the activity is first created. */
    Button buttonOn, buttonOff;
    String TAG = "ServiceActivity";

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    buttonOn = (Button) findViewById(R.id.button_on);
    buttonOff = (Button) findViewById(R.id.button_off);

    buttonOn.setOnClickListener(this);
    buttonOff.setOnClickListener(this);
    Log.v(TAG, "ActivityonCreate");
    }

    @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub
    switch (v.getId()) {
    case (R.id.button_on):
    Log.v(TAG, "ActivitystartService");
    this.startService(new Intent(this,PlayService.class));
    // startService(new Intent(this, PlayService.class));

    break;
    case (R.id.button_off): {
    Log.v(TAG, "ActivitystopService");
    this.stopService(new Intent(this,PlayService.class));
    //stopService(new Intent(this, PlayService.class));

    }
    break;

    default:
    break;

    }

    }

    @Override
    protected void onStop() {
    // TODO Auto-generated method stub
    super.onStop();
    Log.v(TAG, "ActivityonStop");
    }

    @Override
    protected void onDestroy() {
    // TODO Auto-generated method stub
    Log.v(TAG, "ActivityonDestroy");
    super.onDestroy();

    }

    }
    复制代码
    复制代码
    代码
    package com.service.su;

    import java.io.IOException;

    import android.app.Service;
    import android.content.Intent;
    import android.media.MediaPlayer;
    import android.os.IBinder;
    import android.util.Log;
    import android.widget.Toast;

    public class PlayService extends Service {
    String TAG = "ServiceActivity";
    MediaPlayer mediaPlayer;

    @Override
    public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
    }

    @Override
    public void onCreate() {
    // TODO Auto-generated method stub
    super.onCreate();
    Toast.makeText(this, "Play Service Created", Toast.LENGTH_LONG).show();
    Log.v(TAG, "ServiceonCreate");

    mediaPlayer = MediaPlayer.create(this, R.raw.test);

    /*
    * 要用MediaPlayer来创建,不能用MediaPlayer的对象来创建 // 不用带后缀 mediaPlayer = new
    * MediaPlayer(); mediaPlayer.create(this, R.raw.test);
    */

    /*
    * try { mediaPlayer.setDataSource("/sdcard/music/lost times.mp3");
    * mediaPlayer.prepare();
    *
    *
    * //方法二,从网上的链接获取歌曲 try { mediaPlayer.setDataSource(
    * "http://www.yousss.com/uploadfile/mp3/2007-11/20071129134414713.mp3"
    * );
    */

    // mediaPlayer.setLooping(true);
    }

    @Override
    public void onStart(Intent intent, int startId) {
    // TODO Auto-generated method stub
    super.onStart(intent, startId);
    /*
    * //可以在OnCreate里面创建与音乐的链接,也可以在OnStart里面创建 mediaPlayer =
    * MediaPlayer.create(this, R.raw.test);
    */
    Toast.makeText(this, "Play Service onStart", Toast.LENGTH_LONG).show();
    Log.v(TAG, "ServiceonStart");
    mediaPlayer.start();
    }

    @Override
    public void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
    Toast.makeText(this, "Play Service Stopped", Toast.LENGTH_LONG).show();
    Log.v(TAG, "ServiconDestroy");
    mediaPlayer.stop();
    }

    }
    复制代码
  • 相关阅读:
    hdoj 2803 The MAX【简单规律题】
    hdoj 2579 Dating with girls(2)【三重数组标记去重】
    hdoj 1495 非常可乐【bfs隐式图】
    poj 1149 PIGS【最大流经典建图】
    poj 3281 Dining【拆点网络流】
    hdoj 3572 Task Schedule【建立超级源点超级汇点】
    hdoj 1532 Drainage Ditches【最大流模板题】
    poj 1459 Power Network【建立超级源点,超级汇点】
    hdoj 3861 The King’s Problem【强连通缩点建图&&最小路径覆盖】
    hdoj 1012 u Calculate e
  • 原文地址:https://www.cnblogs.com/guilin-hu/p/4459476.html
Copyright © 2011-2022 走看看