最近做项目要写一个Service 监听SD卡的一个服务。其过程如下:
这东西,真是费了我一天功夫。。分享给需要的朋友们。
开机启动:BraodCast-->Service-->Activity,应用安装一次就够了,他会一直在后台运行,即便是被手机
清除。
在网上看了写关于监听SD卡目录变化的资料:
http://www.eoeandroid.com/thread-184121-1-1.html
http://wenku.baidu.com/view/43ec352658fb770bf78a55a0.html
需要的朋友可以做做参考:
好了,下面就贴出源码:
首先,BroadCast在,AndroidManifest.xml注册:这大家都会就不做解释了。只要在xml里面设置Broadcast开机启动权限就OK.
<action android:name="android.intent.action.BOOT_COMPLETED" />
2.实现onReceive()方法;
代码:
public class ClientReciver extends BroadcastReceiver {
static final String ACTION="android.intent.action.BOOT_COMPLETED";
public void onReceive( Context context, Intent intent) {
//判断手机是否开机,开机则启动Activity
if (intent.getAction().equals(ACTION))
{
Intent i=new Intent(context,ClientService.class);
context.startService(i);
Log.i("TAG", "开机启动。。。");
System.out.println("广播开始..");} }
}
触发Service,我需要在Service里做一些监听事情.在监听SD卡目录之前,Android为我们提供了一个已经封装的public abstract class FileObserver抽象类,实现里面的方法OnEvent();
代码:
FileObserver {
private String filepath=null;
private Handler loginHandler;
public PackageReads(String path, Handler loginHandler) {
super(path);
this.loginHandler= loginHandler;
filepath=path;
}
public Handler getLoginHandler() {
return loginHandler;
} public void setLoginHandler(Handler loginHandler) {
this.loginHandler = loginHandler;
} public PackageReads(String path) {
super(path); }
public void onEvent(int event, String path)
{
String date="";
if(filepath!=null && path!=null)
{
switch (event) {
// 文件被创建
case FileObserver.CREATE:
Log.d("all", "path:" + path);
date=filepath+path;
Message msg = new Message();
msg.obj = date;
loginHandler.sendMessage(msg);
break;
default:
break;
}
}
} }
3.准备就绪,我们在Service里面看看结果:OnCreate(),OnStart()做操作
我在这里对手机SD卡"/mnt/sdcard/androidfiletest/"做了监听处理.
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
Log.i("onStart...", "ServiceonStart...");
new Thread(){
int date=0;
public void run() {
if (packagelistener == null) {
packagelistener = new PackageReads("/mnt/sdcard/androidfiletest/",
loginHandler);
packagelistener.startWatching();
}
};
}.start();
在OnCreate 内来获取传入文件信息:
onCreate() {
super.onCreate();
Log.i("onCreate()...", "ServiceonCreate()...");
notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Toast.makeText(ClientService.this, "Service启动..", 1).show();
showNotification();
// timer = new Timer(false);
loginHandler = new Handler() {
public void handleMessage(Message msg) {
super.handleMessage(msg);
datapath = (String) msg.obj;
if(datapath!=null)
{
Toast.makeText(getApplicationContext(),
"发现Pgc文件" + datapath, 1).show();
将获取的文件路径,传送到Activity中,这里用的Bundle
Intent filepath=new Intent(ClientService.this,ListViewWebView.class);
Bundle b=new Bundle();
b.putString("path", datapath);
filepath.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//filepath.putExtra("path", datapath);
System.out.println("datapath="+datapath);
filepath.putExtras(b);
startActivity(filepath);
}
}
};
}
Activity代码:
Bundle b=new Bundle();
b=getIntent().getExtras();
result=b.getString("path");
//result=getIntent().getStringExtra("path");
System.out.println("result=="+result);
运行效果:
这里只针对监听SD卡androidfiletest目录的操作,所以代码只是这部分的希望大家不要介意,真心的希望能对大家有所帮助。