android.intent.action.BOOT_COMPLETED
Intent.ACTION_BOOT_COMPLETED
+++++++++++++++++++++++++++++++++++++++++++++++++
**************************所有的回调都是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);
}
}
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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);
}
}
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++