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>