最近做项目要写一个Service 监听SD卡的一个服务。其过程如下:

这东西,真是费了我一天功夫。。分享给需要的朋友们。

开机启动:BraodCast-->Service-->Activity,应用安装一次就够了,他会一直在后台运行,即便是被手机


android service 监听 activity android service 监听 文件_开机启动

清除。

在网上看了写关于监听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);

运行效果:


android service 监听 activity android service 监听 文件_开机启动_02

这里只针对监听SD卡androidfiletest目录的操作,所以代码只是这部分的希望大家不要介意,真心的希望能对大家有所帮助。