public class MyService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
System.out.println("MyService.onBind");
return null;
}
}
package com.lwz.service;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
/**
* 服务的创建,
* 测试生命周期的过程和先后
* 五个生命周期:
* onCreate
* onStartCommand
* onDestroy
* onBind
* onUnBind
*/
public class MyService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
System.out.println("MyService.onBind");
return null;
}
@Override
public void onCreate() {
System.out.println("MyService.onCreate");
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
System.out.println("MyService.onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
System.out.println("MyService.onDestroy");
super.onDestroy();
}
@Override
public boolean onUnbind(Intent intent) {
System.out.println("MyService.onUnbind");
return super.onUnbind(intent);
}
}
package com.lwz.service;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
/**
* 服务的创建和使用
* 注意这里的服务不依赖于Activity页面,即使页面关闭了,服务没有主动去停止,是不会关闭的
* Service也是在主线程中执行任务的,但是为什么不会造成主线程阻塞??
* 因为做的不是耗时操作,如果做耗时操作一样会造成ANR。。。
* 这里点击绑定服务后,点击停止服务按钮是无效的,要先解绑后,才能停止服务。
* 正常情况下,从绑定状态到解绑状态是不会停止服务的。只是一种状态改变而已。
* 这里点击绑定服务后,点击停止服务按钮是无效的,但是解绑后,会马上停止服务。
*/
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//开启服务
public void startService(View view) {
//开启服务需要Intent对象,和Activity跳转类似
startService(new Intent(this, MyService.class));
}
//停止服务
public void stopService(View view) {
//停止服务的方法
stopService(new Intent(this, MyService.class));
}
//绑定服务
public void bindService(View view) {
//绑定服务
bindService(new Intent(this, MyService.class), conn, flags);
}
//解绑服务
public void unBindService(View view) {
//防止在没有绑定的情况下,去解除绑定,抛出异常
try {
//解除绑定
unbindService(conn);
} catch (Exception e) {
System.out.println("MainActivity.unBindService" + e);
}
}
//服务绑定的连接对象
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
//服务绑定的标识
//BIND_AUTO_CREATE 绑定的同时,启动Service
private int flags = Service.BIND_AUTO_CREATE;
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Service" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="startService"
android:text="启动服务" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="stopService"
android:text="停止服务" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="bindService"
android:text="绑定服务" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="unBindService"
android:text="解绑服务" />
</LinearLayout>
//(一)布局文件activity_main.xml文件实际
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/main_lv"
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>
</RelativeLayout>
package com.lwz.intentservice;
import android.os.Environment;
import android.os.StatFs;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
* SD卡的路径:Environment.getExternalStorageDirectory()
*/
public class FileUtils {
/**
* 获得指定目录下的所有的图片
*/
public static final ArrayList<File> getAllPicture(File dir) {
ArrayList<File> files = getAllFile(dir);
ArrayList<File> imgList = new ArrayList<>();
for (File file : files) {
if (file.getName().endsWith(".png") || file.getName().endsWith(".jpg"))
imgList.add(file);
}
return imgList;
}
/**
* 递归遍历文件夹的方法
*/
public static final void getFileFromDir(File dir, List<File> fileList) {
File[] files = dir.listFiles();
if (files == null)
return;
for (File file : files) {
if (file.isDirectory())
getFileFromDir(file, fileList);
fileList.add(file);
}
}
/**
* 获得根目录下的所有图片
*/
public static final ArrayList<File> getAllPicture() {
return getAllPicture(Environment.getExternalStorageDirectory());
}
}
package com.lwz.intentservice;
import android.content.Context;
import android.widget.BaseAdapter;
import java.util.ArrayList;
import java.util.List;
/**
* 这是一个简化BaseAdapter适配器的工具类
* 这是使用的是定义一个泛型T,使用时传入什么数据,T就是什么数据
* 实际设计中除了getVIew方法外,其他的方法基本是差不多的
* 所以继承这个工具类后只要重写getView方法,就可以使用BaseAdapter了
*/
public abstract class ListItemAdapter<T> extends BaseAdapter {
List<T> list = new ArrayList<>();
Context context;
ListItemAdapter(Context context, List<T> list) {
this.context = context;
this.list = list;
}
ListItemAdapter(Context context, T[] list) {
this.context = context;
for (T t : list) {
this.list.add(t);
}
}
@Override
public int getCount() {
return list == null ? 0 : list.size();
}
@Override
public T getItem(int position) {
return list == null ? null : list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
}
package com.lwz.intentservice;
import android.app.IntentService;
import android.content.Intent;
import android.os.Message;
import android.util.Log;
import java.io.File;
import java.util.ArrayList;
/**
* IntentService的使用
* IntentService是Service的子类,也需要在xml中注册
* 它有自定义的子线程的方法
* 这里主要需要解决的问题是资源文件得到后怎么把数据传递给UI线程的Activity
*/
public class MyIntentService extends IntentService {
/**
* 通过构造方法,传入子线程的名字
* 但是这里必须要创建一个无参的构造方法
*/
public MyIntentService() {
super("myService");
}
/**
* 这是在子线程中的执行操作
*/
@Override
protected void onHandleIntent(Intent intent) {
Log.e("TAG", "子线程开始工作");
//遍历文件夹获取图片
ArrayList<File> list = FileUtils.getAllPicture();
//使用handler发送信息
Message msg = Message.obtain();
//这里给handler对象传递一个对象
msg.obj = list;
//发送广播来传递数据
Intent intent1 = new Intent("filefinish");
intent1.putExtra("file", list);
sendBroadcast(intent1);
}
@Override
public void onCreate() {
super.onCreate();
Log.e("TAG", "onCreate");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.e("TAG", "onDestroy");
}
}
package com.lwz.intentservice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ListView;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
* 这里使用服务来IntentService来遍历文件夹
* 在程序创建的使用就要启动服务
* 在页面销毁的时候就停止服务
但是Service执行完任务后还有传递数据给MainActivity
在MainActivity中才能进行UI界面的更新
这就涉及到Service和Activity的数据传递问题了
这里使用的是用广播来传递数据
*/
public class MainActivity extends AppCompatActivity {
//定义布局内的控件
ListView listView;
//定义适配器的数据的集合
//一定要static???
static ArrayList<File> fileList;
static MyBaseAdapter adapter;
MyBroadcastReceiver mbcr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mbcr = new MyBroadcastReceiver();
//动态注册一个广播
IntentFilter filter = new IntentFilter();
filter.addAction("filefinish");
registerReceiver(mbcr, filter);// 注册
//创建适配器的对象
adapter = new MyBaseAdapter(this, fileList);
//实例化布局内的控件
listView = (ListView) findViewById(R.id.main_lv);
//给listView设置适配器
listView.setAdapter(adapter);
//启动服务
startService(new Intent(this, MyIntentService.class));
}
//创建适配器的类
class MyBaseAdapter extends ListItemAdapter<File> {
MyBaseAdapter(Context context, List<File> list) {
super(context, list);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView image = null;
if (convertView == null) {
image = new ImageView(getBaseContext());
convertView = image;
} else {
image = (ImageView) convertView;
}
//设置图片资源和属性
image.setImageURI(Uri.fromFile(fileList.get(position)));
image.setScaleType(ImageView.ScaleType.FIT_XY);
image.setAdjustViewBounds(true);
return image;
}
}
//停止服务
public void stop() {
stopService(new Intent(MainActivity.this, MyIntentService.class));
}
@Override
protected void onDestroy() {
super.onDestroy();
//即使之前停止了服务,再次停止服务也是不会报错的
stop();
//解除广播
unregisterReceiver(mbcr);
}
//动态创建广播接收者
class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//对接收到的广播进行处理,intent里面包含数据
fileList = (ArrayList<File>) intent.getSerializableExtra("file");
//刷新适配器
adapter.notifyDataSetChanged();
//停止服务,它的子线程也会停止
stop();
}
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e("onStartCommand", intent.getStringExtra(msg));
return super.onStartCommand(intent, flags, startId);
}
//定义一个静态的类变量,单例的使用准备
private static MyService instance;
//静态方法,返回的是一个本类对象
//为了能让另一边的类调用Myservice的方法
public static MyService getInstance() {
return instance;
}
@Override
public void onCreate() {
super.onCreate();
//单例模式变量赋值
instance = this;
}
public void print(String msg) {
Log.e("service", msg);
}
/**
* 单例模式传参
*MyService这里通过一个静态方法,来获得MyService的对象
这里通过MyService.getInstance()方法来获得MyService对象
*/
//必须保证Myservice对象不能为null
//静态的变量,最后释放(不用的时候,手动将static变量=null)
if (MyService.getInstance() != null) {
MyService.getInstance().print("使用单例从activity中调用service的方法");
}
@Override
public void onCreate() {
super.onCreate();
//动态注册广播接收者,要定义好接收的action属性值
IntentFilter filter = new IntentFilter("service");
registerReceiver(serviceReceiver, filter);
}
//定义一个广播接收者BroadcastReceiver
BroadcastReceiver serviceReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.e("service", "接收到了activity发送的广播:" + intent.getStringExtra("msg"));
//发送广播给MainActivity
sendBroadcast(new Intent("activity").putExtra("msg", "发送给activity的消息"));
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//注册本类内的广播,定义好action的属性值
IntentFilter filter = new IntentFilter("activity");
registerReceiver(activityReceiver, filter);
}
/**
* 通过广播来传递数据
*/
public void sendBroadcast(View view) {
//指明action属性值
Intent intent = new Intent("service");
intent.putExtra("msg", "activity向广播传递一个hello broadcast");
sendBroadcast(intent);
}
//定义一个内部类的广播接收者,用于接收MyService传递过来的数据
BroadcastReceiver activityReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.e("activity", intent.getStringExtra("msg"));
}
};
//定义一个接口
interface Callback {
//定义两个要实现的方法
void call();
void start();
}
//定义一个接口对象
Callback callback;
/**
* 创建Binder类,很多很多的Service就是通过Binder机制来和客户端通讯交互的。
*/
class Mybinder extends Binder {
public MyService getService() {
return MyService.this;
}
//设置回调方法
public void setCallback(Callback callback) {
MyService.this.callback = callback;
}
}
//定义一个模拟开始音乐播放的方法
//需要重写start里面的方法来开始播放音乐
public void startMusic() {
//播放
Toast.makeText(this, "音乐开始播放", Toast.LENGTH_SHORT).show();
callback.start();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
//要传递一个MyBinder对象给MainActivity
return new MyBinder();
}
//定义一个模拟开始音乐播放的方法
//需要重写start里面的方法来开始播放音乐
public void startMusic() {
//播放
Toast.makeText(this, "音乐开始播放", Toast.LENGTH_SHORT).show();
//在MainActivity中实例化callback对象
callback.start();
}
/**
* 绑定服务Service
调用MyService的方法来调用内部类的接口方法
*/
//定义一个MyService对象
MyService myService;
public void bindService(View view) {
bindService(new Intent(this, MyService.class), conn, BIND_AUTO_CREATE);
myService.startMusic();
}
//创建ServiceConnection对象
ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//连接服务后,操作。。。
//获取IBinder的bind对象,从MyService的onBinder中传递过来的
MyService.Mybinder bind = (MyService.Mybinder) service;
//通过bind对象获取Service对象
myService = bind.getService();
//设置监听事件的回调方法,并实现里面的两个方法
//这里的回调方法不是MyService中的,而是内部类Mybinder中的
bind.setCallback(new MyService.Callback() {
@Override
public void call() {
Log.e("activity", "Service回调Activity");
}
@Override
public void start() {
//比如在后台播放音乐;开始播放音乐
Log.e("action", "正在播放音乐");
//关闭页面
finish();
}
});
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有