在 BroadCastReceiver android 8 中启动服务

如何解决在 BroadCastReceiver android 8 中启动服务

我想启动一个观察android下载文件夹的长时间服务, 我创建了一个 broadcastReceiver,它接收 BOOT_COMPLETED 事件,这个 broadcastReceiver 将使用 context.startStartService() 方法启动服务。 它似乎在低于 8 的 android 版本中正常工作,但对于更高版本的 android,我收到一个错误

android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground(): ServiceRecord{ba36f7 u0 packagename/.FileSystemObserverService}

StartupbroadCastReceiver


public class StartupReceiver extends broadcastReceiver {
    private static final String TAG = "StartupReceiver";
    @Override
    public void onReceive(Context context,Intent intent) {
        Log.e(TAG,"onReceive: called " );
        appendLog(context,"OnReceived called StartupReceive line 20");
        Toast.makeText(context,"Boot Completed",Toast.LENGTH_SHORT).show();
        Intent myIntent = new Intent(context,FileSystemObserverService.class);
        if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
             context.startForegroundService(myIntent);
            return;
        }

        context.startService(myIntent);
    }

    private void appendLog(Context context,String log){
        SharedPreferences sp  = context.getSharedPreferences("sp",Context.MODE_PRIVATE);
        String preLogs = sp.getString("logs","");
        preLogs+="\n"+log;
        sp.edit().putString("logs",preLogs).apply();
    }


}

上面的代码是我的 broadcastReceiver,它接收 BOOT_COMPLETED 事件。

文件系统观察者

public class FileSystemObserverService extends Service {

    private Observer mMainObserver;
    private static final String TAG = "FileSystemObserverServi";
    @Override
    public int onStartCommand(Intent intent,int flags,int startId) {
        Log.e(TAG,"onStartCommand: get called " );
        observe();
        return super.onStartCommand(intent,flags,startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.e(TAG,"onDestroy: called for fileObserverService");
    }


    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    public void observe(){
        Thread t= new Thread(new Runnable() {
            @Override
            public void run() {
                Log.e(TAG,"run: thread is running " );
                File str = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
                if (str!=null){
                    Log.e(TAG,"run: "+str.getAbsolutePath());
                    String downloadsPath = str.getAbsolutePath();
                   mMainObserver= new Observer(downloadsPath,new DataInterface() {
                       @Override
                       public String getMacAddress() {
                           SharedPreferences sp = getSharedPreferences("sp",MODE_PRIVATE);
                           return sp.getString("mac_address",null);
                       }

                       @Override
                       public void appendLog(String log) {
                           SharedPreferences sp  = getSharedPreferences("sp",MODE_PRIVATE);
                           String preLogs = sp.getString("logs","");
                           preLogs+="\n"+log;
                           sp.edit().putString("logs",preLogs).apply();
                       }
                   });
                   mMainObserver.startWatching();
                }
            }
        });
        t.setPriority(Thread.MIN_PRIORITY);
        t.start();
    }
}

interface DataInterface{
    public String getMacAddress();
    public void appendLog(String log);
}

class Observer extends FileObserver{

    private static final String TAG = "Observer";
    List<SingleFileObserver> mObserves;
    String mPath;
    int mMask;
    Context mContext;
    private SendPDF sendPDF;
    private DataInterface di ;


    public Observer(String path,DataInterface di) {
        this(path,ALL_EVENTS);
        this.di = di;
    }


    @Override
    public void startWatching() {
        Log.e(TAG,"startWatching: getCalled" );
        di.appendLog("Line 104 FileSystemObserverService startWatching : called");

        try{

            if(mObserves!=null)
                return;
            mObserves = new ArrayList<SingleFileObserver>();
            Stack<String> stack = new Stack<String>();
            stack.push(mPath);
            while (!stack.isEmpty()){
                String parent = stack.pop();
                mObserves.add(new SingleFileObserver(parent,mMask));
                File path  = new File(parent);
                File[] files = path.listFiles();
                if (files==null) continue;
            }
            for (SingleFileObserver ob  : mObserves){
                ob.startWatching();
            }
        }catch (Exception e){
            di.appendLog("Line 124 FileSystemObserverService "+e.getMessage());
        }



    }

    @Override
    public void stopWatching() {
        if (mObserves==null)
            return;
        for (SingleFileObserver ob : mObserves){
            ob.stopWatching();
        }
        mObserves.clear();
        mObserves = null;
    }

    public Observer(String path,int mask){
        super(path,mask);
        mPath = path;
        mMask = mask;
    }





    public String getReadableEventName(int e ){
        switch (e){
            case FileObserver.OPEN:
                return  "OPEN";
            case FileObserver.CREATE:
                return  "CREATE";
            case DELETE_SELF:
                return  "DELETE_SELF";
            case DELETE :
                return "DELETE";
            case MOVED_FROM :
                return  "MOVED_FROM";
            case MOVED_TO:
                return  "MOVED_TO";
            case MOVE_SELF:
                return  "MOVED_SELF";
            default:
                return "UNKNowN";
        }
    }


    @Override
    public void onEvent(int event,@Nullable String path) {
//        if (mContext!=null)
//            Toast.makeText(mContext,"Event Called " +path,Toast.LENGTH_SHORT).show();
        Log.e(TAG,"onEvent: Called "+path);
        di.appendLog("Line 157 FileSystemObserverService   onEventCalled with " +event+" name:   " +getReadableEventName(event)+  " path: "+path);
        try{

            switch (event){
                case FileObserver.OPEN:
                    Log.e(TAG,"onEvent: OPEN" );
                    break;
                case FileObserver.CREATE:
                    Log.e(TAG,"onEvent: CREATE");

                    if (path!=null) {
                        File file = new File(path);
                        if (file.isDirectory())
                            return;
                        if (!path.endsWith(".pdf"))
                            return;
                        sendPDF = new SendPDF(path,di.getMacAddress(),di);
                        di.appendLog("Line 200 FileSystemObserverService SendPdf instantiated  and trying to execute");
                        sendPDF.execute();
                    }
                    break;
                case DELETE_SELF:
                case DELETE :
                    Log.e(TAG,"onEvent: DELETE");
                    break;
                case MOVED_FROM :
                case MOVED_TO:
                case MOVE_SELF:
                    Log.e(TAG,"onEvent: MOVE");
                    break;
                default:
            }
        }catch (Exception e){
            di.appendLog( "Line 215 FileSystemObserverService "+e.getMessage());
        }
    }


    private class SingleFileObserver extends FileObserver{
        private String mPath ;

        public SingleFileObserver(String path,int mask) {
            super(path,mask);
            mPath = path;
        }


        @Override
        public void onEvent(int event,@Nullable String path) {
            try{
                String newPath = mPath+"/"+path;
                Observer.this.onEvent(event,newPath);
                Log.e(TAG,"onEvent: "+newPath);
            }catch (Exception e){
                Log.e(TAG,"onEvent: "+e.getMessage());
            }
        }
    }
}



版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?