4.1.2 Service 的启动方式, Service的应用-播放音乐和下载文件

android.intent.action.BOOT_COMPLETED
Intent.ACTION_BOOT_COMPLETED


注意了raw 文件中的文件文件名不能大写


+++++++++++++++++++++++++++++++++++++++++++++++++
**************************所有的回调都是on开头的。
*************************************************


<uses-permission android:name="android.intent.action.BOOT_COMPLETED"/>


mmmmmmmmmmmmmmmmmmmmm
两种启动方式startService 和bindService


1:音乐播放
2:下载多线程的实现,使用两种方式,一种是自己定义的线程,第二种使用IntentService
3: 使用bindService 来启动service




Service 初步使用:
1:创建Service,在清单文件注册
2:实现onBind的方法
3:可以重写onStartCommand这些方法
4:服务不会自动启动,需要使用startService或者bindService
onCreate 方法,只要服务没有从进程中消失,那么onCreate方法只调用一次,不论启动多少次服务,
onCreate进行资源初始化,例如创建进程,打开数据库。。。




音乐播放:
0:在res 下面创建raw文件夹:然后呢,将mp3文件拷贝进去:


1:新建Service:继承Service,实现onBind 方法,重写onStartCommand这些方法:


public class MusicService extends Service{
    private MediaPlayer player;
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }


    @Override
    public void onCreate() {
        super.onCreate();
        player = MediaPlayer.create(this,R.raw.nobody);
    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        String action = intent.getStringExtra("action");
        if(action!=null) {
            if ("play".equals(action)) {
                player.start();
            } else if ("pause".equals(action)) {
                player.pause();
            }
        }
        //return super.onStartCommand(intent, flags, startId);
        return START_REDELIVER_INTENT;
    }
}


2:注册清单文件:


<service android:name=".service.MusicService"/>
3:main xml 文件添加button:


    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Play"
        android:onClick="btnPlay"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Pause"
        android:onClick="btnPause"/>


4:MainActiivty
public class MainActivity extends AppCompatActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }


    public void btnPlay(View view) {
        Intent intent = new Intent(this, MusicService.class);
        intent.putExtra("action","play");
        startService(intent);
    }


    public void btnPause(View view) {
        Intent intent = new Intent(this, MusicService.class);
        intent.putExtra("action","pause");
        startService(intent);
    }
}


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
多线程下载


新建下载Service:


public class DownloadService extends Service {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }


    @Override
    public void onCreate() {
        super.onCreate();
    }


    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}


加入线程如下:
public class DownloadService extends Service implements Runnable{
    //服务与线程的创建:通常服务在onCreate时创建线程,进行耗时操作的处理;
    //每一次startService onStartCommand() 只是用于接收传递给线程的数据参数;
    private Thread thread;


    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        //用于获取参数;交给线程执行
        return super.onStartCommand(intent, flags, startId);
    }


    @Override
    public void onCreate() {
        super.onCreate();
        thread = new Thread(this);
    }


    public void run(){
        //TODO: 处理文件下载


    }


    @Override
    public void onDestroy() {
        super.onDestroy();
        thread.interrupt();
    }
}


上面的
public class DownloadService extends Service implements Runnable{
    //服务与线程的创建:通常服务在onCreate时创建线程,进行耗时操作的处理;
    //每一次startService onStartCommand() 只是用于接收传递给线程的数据参数;
    private Thread thread;
    private LinkedList<String> queue;


    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        //用于获取参数;交给线程执行
        if(intent!=null){
            String url = intent.getStringExtra("url");
            queue.add(url);
        }
        return super.onStartCommand(intent, flags, startId);
    }


    @Override
    public void onCreate() {
        super.onCreate();
        //用于缓冲onStartCommand 传递的参数;
        queue = new LinkedList<String>();
        thread = new Thread(this);
thread.start();
    }


    public void run(){
        //TODO: 处理文件下载
        while(true){
            try {
                Thread.sleep(1000L);
                if(!queue.isEmpty()){
                    String s = queue.removeFirst();
                    Log.d("Download", "Download url=" + s);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }


    @Override
    public void onDestroy() {
        super.onDestroy();
        thread.interrupt();
    }
}




上面的方法可以用,但是稍微有点麻烦,+++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++
新建一个Service 在Other-》Service-》IntentService
或者自己写:


public class DownloadSingleService extends IntentService {
}


IntentService 如果是单独串行执行的话,就是用这个。
内置一个线程简化开发。




清单文件:
<service android:name=".service.DownloadSingleService"/>


添加:
<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Download URL"
    android:onClick="btnDownloadUri"/>




    public void btnDownloadUri(View view){
        String url =textUri.getText().toString();
        Intent intent = new Intent(this, DownloadSingleService.class);
        intent.putExtra("url",url);
        startService(intent);
    }


修改DownloadSingle


注意一定要是空的构造方法。
-----
public class DownloadSingleService extends IntentService {


    //构造方法,必须要调用父类的super(name) 这个构造;实际上没有什么作用,我们可以放一个空的
    //因为清单文件注册Service 一定要有无参构造
    //public DownloadSingleService(String name) {super("OnlyForDebug");}
    public DownloadSingleService() {super("OnlyForDebug");}
    /**
     * onHandleIntent 实际上就是处理startService 传递的额Intent参数的方法
     * 这个方法运行在子线程。
     * @param intent
     */
    @Override
    protected void onHandleIntent(Intent intent) {
        String url = intent.getStringExtra("url");
        Log.d("DownloadSingleService", "开始下载 " + url);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Log.d("DownloadSingleService", "下载完成 " + url);
    }
}




++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值