Android——Service 四大组件之二

本文介绍 Android 开发中 Service 的使用方法及其实战案例,包括 APP 版本检测、下载及通知提醒等功能实现,并探讨 Service 生命周期及其重启策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 Service  四大组件之二Activity


Service是一个没有操作界面的组件,类似于Window中的服务

本章任务 1使用Service进行APP版本检测

2使用Service进行APP版本下载

3使用Notfication进行消息提醒;

Service生命周期

onCreat    只会出现一次

onStartCoommand   (非绑定直接进入) 开始执行命令

onDestroy    (销毁)

onBind   (绑定直接进入)

onUnbind    (解除绑定)

Start 启动服务   onCreate()onStartCoommand()*** onDestroy

Bind绑定服务onCreate()onBind()**onUnbind()onDestroy

Service开发步骤:

1.继承Service

2.注册Service

3.android组件中启动Service

4.停止服务


通过startService()方法启动的Service,需要调用stopService()或者Service自己调用stopSelf()来终止。那么如果系统在显示调用stopService()或者stopSelf()之前终止了Service,应该如何重写启动Service呢。
我们注意到在上面的程序案例中,重写了Service里面onStartCommand方法,而该方法的返回值决定了当Service被系统终止后,系统该如何响应Service的重启。具体的方法签名如下:
public int onStartCommand(Intent intent, int flags, int startId)
该方法的返回值主要有:
Ø START_STICKY:描述了标准的重启行为。如果返回该值,那么当Service被系统杀死后重新启动时,将会调用onStartCommand方法。需要注意的是此时参数intent为null。
Ø START_NOT_STICKY:如果返回该值,当Service在执行完onStartCommand后被系统杀死,系统不会重启该服务。
Ø START_REDELIVER_INTENT:如果返回该值,当Service被系统杀死后重新启动时,情况与START_STICKY类似。不同的是Android将会保留杀死Service前最后一次传入onStartCommand的参数intent值,并作为参数传入到新创建的Service的onStartCommand方法中。
Ø START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证Service被系统终止后一定能重启 





package c.example.jreduch09;

import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
private Button start1;
    private Button start2,startmp3;
    private Button stop1,stop2;
    private Button download1,download2;
    private MyService myService;
    //服务连接
    private ServiceConnection serviceConnection=new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName,
                                       IBinder iBinder) {
            myService=((MyService.MyBinder) iBinder).getService();
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {

        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        start1=(Button)findViewById(R.id.start1);
        start2=(Button)findViewById(R.id.start2);
        startmp3=(Button)findViewById(R.id.startmp3);
        stop1=(Button)findViewById(R.id.stop1);
        stop2=(Button)findViewById(R.id.stop2);
        download1=(Button)findViewById(R.id.download1);
        download2=(Button)findViewById(R.id.download2);



        start1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent it=new Intent(MainActivity.this,MyService.class);
//                it.putExtra("hh",4);
                startService(it);
            }
        });
        stop1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent it=new Intent(MainActivity.this,MyService.class);
                stopService(it);
            }
        });

        start2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent it=new Intent(MainActivity.this,MyService.class);
              //  bindService(it,serviceConnection,0);
                bindService(it,serviceConnection,BIND_AUTO_CREATE);

            }
        });
        stop2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //解除绑定
                if (myService!=null){
                    unbindService(serviceConnection);}
            }
        });
        startmp3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (myService!=null){
                    myService.playMusic();
                }
            }
        });

        //非绑定下载Service
        download1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent it=new Intent(MainActivity.this,MyDownLoadService.class);
                startService(it);
            }
        });
        download2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent it=new Intent(MainActivity.this,MyDownLoadService.class);
                stopService(it);
            }
        });
    }

    

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //解绑
        if (myService!=null){
        unbindService(serviceConnection);}
    }
}

package c.example.jreduch09;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.RingtoneManager;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;

import java.io.IOException;

public class MyService extends Service {

    private boolean pause=false;

    public MyService() {
    }
private MediaPlayer mediaPlayer;
    public class MyBinder extends Binder {
        public  MyService getService(){
            return MyService.this;
        }

    }
    @Override
    public void onCreate() {
        super.onCreate();
      mediaPlayer=new MediaPlayer();

      //  mediaPlayer=MediaPlayer.create(this,R.raw.i);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {


        Log.d("",intent.getExtras()+"");

          playMusic();


        return START_REDELIVER_INTENT;
//        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
       // throw new UnsupportedOperationException("Not yet implemented");

        return new MyBinder();

    }

    @Override
    public boolean onUnbind(Intent intent) {
        return super.onUnbind(intent);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (mediaPlayer!=null){
            mediaPlayer.stop();

        }

//        mediaPlayer.setDataSource();//路径
//       mediaPlayer.setLooping();//循环
//        mediaPlayer.prepare();  //准备
//        mediaPlayer.start();  //开始
//        mediaPlayer.pause();  mediaPlayer.stop();//暂停
//
//        mediaPlayer.reset();
//        mediaPlayer.setDataSource();
//        mediaPlayer.setLooping();
//        mediaPlayer.prepare();
//        mediaPlayer.start();
        //播放完成
//        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
//            @Override
//            public void onCompletion(MediaPlayer mediaPlayer) {
//
//            }
//        });
//        mediaPlayer.seekTo();//进度条快进歌曲播放位置。
    }


    public   void playMusic(){

        if (mediaPlayer.isPlaying()){
            mediaPlayer.pause();//暂停
            pause=true;

        }else {

                if (pause){
                    mediaPlayer.start();
                    pause=false;
                    return;
                }else {

                    try {
                        //设置播放路径
                        mediaPlayer.setDataSource(this, RingtoneManager
                                .getDefaultUri(RingtoneManager.TYPE_RINGTONE));
                        //单曲循环
                        mediaPlayer.setLooping(true);
                        mediaPlayer.prepare();  //准备
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    //启动播放器
                    mediaPlayer.start();

                }

        }
    }
}

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"

    tools:context="c.example.jreduch09.MainActivity">
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <Button
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:id="@+id/start1"
        android:text="启动服务(非绑定)"
        />
    <Button
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:id="@+id/stop1"
        android:text="停止服务(非绑定)"
        />
    <Button
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:id="@+id/start2"
        android:text="启动服务(绑定)"
        />
    <Button
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:id="@+id/startmp3"
    android:text="播放音乐(绑定)"
    />
    <Button
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:id="@+id/stop2"
        android:text="解除绑定(绑定)"
        />


    <Button
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:id="@+id/download1"
        android:text="开始下载(非绑定)"
        />
    <Button
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:id="@+id/download2"
        android:text="停止下载(非绑定)"
        />
</LinearLayout>

</RelativeLayout>

版本检测与下载——Service

package c.example.jreduch09;

import android.app.DownloadManager;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.IBinder;
import android.widget.Toast;

import org.json.JSONException;
import org.json.JSONObject;

import c.example.jreduch09.util.HttpUtil;
import c.example.jreduch09.util.UrlUtil;

public class MyDownLoadService extends Service {
    private int vid,i;
    public MyDownLoadService() {
    }

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

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
      //  return super.onStartCommand(intent, flags, startId);
        try {
            vid = getPackageManager().getPackageInfo(this.getPackageName(), 0)
                    .versionCode;
            String ur2 = UrlUtil.schoolUrl + "apk";

           new Getapk().execute(ur2);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
       return START_REDELIVER_INTENT;
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }
    private  void downLoad(){
        DownloadManager downloadManager=(DownloadManager)
                getSystemService(Context.DOWNLOAD_SERVICE);
        String downUrl= UrlUtil.schoolUrl + "apk/cc.apk";
        DownloadManager.Request request=new DownloadManager.Request(Uri.parse(downUrl));

        request.setDestinationInExternalPublicDir("/"+getPackageName()+"/","zyf.apk");
        request.setTitle("....下载");
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
        downloadManager.enqueue(request);
    }


    public class Getapk extends AsyncTask<String, Void, String> {


        @Override
        protected String doInBackground(String... strings) {
            // url= UrlUtil.schoolUrl+strings[0];

            return HttpUtil.HttpGet(strings[0]);
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            if (s == null) {
                Toast.makeText(getBaseContext(), "没有数据网路不好", Toast.LENGTH_SHORT).show();

            } else {
                try {
                    JSONObject obj = new JSONObject(s);

                    i= Integer.parseInt(obj.getString("vid"));
                    if (vid<i&&false){
                        Toast.makeText(getBaseContext(), "版本更新", Toast.LENGTH_SHORT).show();
                        downLoad();
                    }else{
                        Toast.makeText(getBaseContext(), "已经是版本更新", Toast.LENGTH_SHORT).show();

                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }


            }


        }
    }
}




package c.example.jreduch09;

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;

import com.gitonway.lee.niftymodaldialogeffects.lib.Effectstype;
import com.gitonway.lee.niftymodaldialogeffects.lib.effects.BaseEffects;

public class Main2Activity extends AppCompatActivity implements Main2Service.StopImg {

    private ImageView show;
    private  boolean click=false;
    private boolean run=true;
    private int[] imgs={R.mipmap.a,R.mipmap.b,R.mipmap.c,R.mipmap.d,R.mipmap.e,R.mipmap.f,R.mipmap.h,R.mipmap.i,R.mipmap.j,R.mipmap.k,
            R.mipmap.l,R.mipmap.m,R.mipmap.n,R.mipmap.o,R.mipmap.p,R.mipmap.q,R.mipmap.r,R.mipmap.s,R.mipmap.t};
    private Effectstype[] types={Effectstype.Fadein,Effectstype.Fall,Effectstype.Fliph,Effectstype.Flipv,
            Effectstype.Newspager,Effectstype.RotateBottom,Effectstype.RotateLeft,Effectstype.Shake,
            Effectstype.Sidefill,Effectstype.SlideBottom,Effectstype.Slideright,Effectstype.Slidetop,Effectstype.Slideleft,
            Effectstype.Slit};

private Handler handler=new Handler(){

    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        start(msg.arg1,4000,msg.what);
    }
};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_main2);
       getSupportActionBar().hide();
show=(ImageView)findViewById(R.id.show);
        show.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (click){
                    return;
                }
                click = true;
                Intent intent = new Intent(Main2Activity.this,Main2Service.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startService(intent);
                start(8,5000,8);
               Main2Service.setMusicStop(Main2Activity.this);
              new Thread(new ImgNext()).start();
            }
        });
    }

    public void stop() {
        run = false;
    }

    public class ImgNext implements Runnable{

        @Override
        public void run() {
            int i = -1;
            int which = -1;
            Message message;
            while (i<imgs.length&&run){
                if (which == types.length-1){
                    which = 0;
                }
                if (i == imgs.length-1){
                    i = 0;
                }
                try {
                    Thread.sleep(5000);
                    message = new Message();
                    i++;
                    which++;
                    message.what = i;
                    message.arg1 = which;
                    handler.sendMessage(message);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            if (!run){
                message = new Message();
                message.what = 10;
                message.arg1 = 0;
                handler.sendMessage(message);
            }
        }
    }
    private void start(int which,int mDuration,int img) {
        Log.d("===whice>:",which+"");
        show.setImageResource(imgs[img]);
        BaseEffects animator = types[which].getAnimator();
        if (mDuration != -1) {
            animator.setDuration(Math.abs(mDuration));
        }
        animator.start(show);
    }

}

package c.example.jreduch09;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.RingtoneManager;
import android.os.IBinder;

import java.io.IOException;

public class Main2Service extends Service {
    private static StopImg stopImg;
    private boolean pause=false;
    private MediaPlayer mediaPlayer;
    public Main2Service() {
    }
    @Override
    public void onCreate() {
        super.onCreate();
        mediaPlayer=new MediaPlayer();
        try {
            mediaPlayer.setDataSource(this, RingtoneManager
                    .getDefaultUri(RingtoneManager.TYPE_RINGTONE));
            mediaPlayer.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //  mediaPlayer=MediaPlayer.create(this,R.raw.i);
    }
    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        mediaPlayer.start();
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mediaPlayer) {
                stopImg.stop();
            }
        });
        return super.onStartCommand(intent, flags, startId);
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    public static void setMusicStop(Context context){
        stopImg = (StopImg) context;
    }

    public interface StopImg{
        public void stop();
    }
}

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"

    tools:context="c.example.jreduch09.Main2Activity">
<ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/show"


    />
</RelativeLayout>





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值