Как отменить регистрацию широковещательного приемника, который находится в классе обслуживания в Android?

#android #service #broadcastreceiver

#Android #Обслуживание #broadcastreceiver

Вопрос:

Я хочу, чтобы кнопка startreceiver и stopreceiver и кнопка buttonoff нажимали на кнопку click приемник запускается, но кнопка buttonoff не останавливается, это выдает мне ошибку

 buttonon.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        Calendar cur_cal = Calendar.getInstance();
        cur_cal.setTimeInMillis(System.currentTimeMillis());
        Intent intent = new Intent(MainActivity.this, WifiScanService.class);
        PendingIntent pintent = PendingIntent.getService(MainActivity.this, 0, intent, 0);
        AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        alarm.setRepeating(AlarmManager.RTC_WAKEUP, cur_cal.getTimeInMillis(), 10*1000, pintent);    
        startService(new Intent(MainActivity.this,WifiScanService.class));  
    }
}
  

buttonoff..setOnClickListener(новый OnClickListener() {

 @Override
public void onClick(View v) {   
    Calendar cur_cal = Calendar.getInstance();
    cur_cal.setTimeInMillis(System.currentTimeMillis());
    Intent intent = new Intent(MainActivity.this, WifiScanService.class);
    PendingIntent pintent = PendingIntent.getService(MainActivity.this, 0, intent, 0);
    AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    alarm.cancel(pintent);
    stopService(new Intent(MainActivity.this,WifiScanService.class));       
}
  

Wifiscanservice.class

 public class WifiScanService extends Service{

    private static String TAG="WifiScanService";
    WifiManager mainWifi;
    WifiReceiver receiverWifi;
    List<ScanResult> wifiList;
    String wifinetworkname;


    String userid="";
    String longitude="";
    String latitude="";
    String terminalid="";
    String wifiname="";
    String timestamp="";
    String sid="";
    String success="";
    String message="";

 // for session
    SharedPreferences spreferences;
    Editor edit;

    public WifiScanService(){
        super();
    }

    @Override
    public void onDestroy(){
        super.onDestroy();

        Log.i(TAG, "ondestroy");

        unregisterReceiver(receiverWifi);

    }




        @Override
    public void onCreate(){
        Log.i(TAG, "onCreate");
    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) 
    {

        Log.d("WifiScanService","In Service");

        wifinetworkname = getString(R.string.wifinetworks);
        mainWifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        receiverWifi = new WifiReceiver();
        registerReceiver(receiverWifi, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));

        if (mainWifi.isWifiEnabled() == false)
        {  
                // If wifi disabled then enable it
                Toast.makeText(getApplicationContext(), "wifi is disabled..making it enabled",
                Toast.LENGTH_LONG).show();

                mainWifi.setWifiEnabled(true);
        } 
        mainWifi.startScan();
        return Service.START_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }




/////////////////////////////////////////////////////////////////////////////////////

    class WifiReceiver extends BroadcastReceiver 
    {

        // Classes For Database
        private     SQLiteDatabase  mSQLiteDatabase = null;
        private     DB_Helper       mDB_Helper = null;

        // get latitude and longitude
        GPSTracker gps;

        String result="";
        // This method call when number of wifi connections changed
        public void onReceive(Context c, Intent intent) 
        {


            spreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
            sid=spreferences.getString("id","");

             // for get the location
            gps = new GPSTracker(getApplicationContext());

            Log.d("WifiReceiver","In Receiver");
            wifiList = mainWifi.getScanResults();
            for(int i = 0; i < wifiList.size(); i  )
            {
                  //  Vibrator v = (Vibrator)c.getSystemService(Context.VIBRATOR_SERVICE);
                     // Vibrate for 500 milliseconds
                    // v.vibrate(500);

                /*
                     ArrayList<HashMap<String,String>>  dbwifilist= new ArrayList<HashMap<String,String>>();

                     Open_Database();

                     dbwifilist=DB_Helper.CheckWifiFound(mSQLiteDatabase, 
                                            DB_Constant.TABLE.MYWIFI, 
                                            DB_Constant.MYWIFI.WIFINAME,
                                            wifiList.get(i).SSID.toUpperCase().toString());
                     Close_Database();

                     if(dbwifilist.size()>0)
                     {
                        if(gps.canGetLocation())
                        {   
                           double   mlatitude = gps.getLatitude();
                           double   mlongitude = gps.getLongitude();
                           latitude=Double.toString(mlatitude);
                           longitude=Double.toString(mlongitude);
                        }
                        else
                        {
                            ///Toast tx=Toast.makeText(c,"GPS IS DISABLE",Toast.LENGTH_SHORT);
                           // tx.show();

                        }
                        wifiname=wifiList.get(i).SSID;
                        terminalid=dbwifilist.get(0).get(DB_Constant.MYWIFI.TERMINAL_ID).toString();
                        if(!sid.equals(""))
                        {   

                            if(CheckConnection.getInstance(getApplicationContext()).isOnline(getApplicationContext()))
                            {
                                new StoreUserLocationAsync().execute("");
                            }
                            else
                            {
                                 Toast.makeText(getApplicationContext(), "wifi is disabled..making it enabled",Toast.LENGTH_SHORT).show();
                            }



                        }
                     }

                   //  Toast tx=Toast.makeText(c,"PingCM2C Network Found - "   wifiList.get(i).SSID,Toast.LENGTH_SHORT);
                   //  tx.show();

                   //  Log.d("WifiReceiver","In Receiver" wifiList.get(i).SSID);
                */
            }

        }


        public class StoreUserLocationAsync extends AsyncTask<String,String,String>
        {

            @Override
            protected String doInBackground(String... params) 
            {
                JsonParser jparser= new JsonParser();


                Date date = new Date();
                SimpleDateFormat formatdate = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
                timestamp=formatdate.format(date);

                String url="http://ringmyserver.com/Pingm2c/rest/userservice/storeUserLocation?userID=" sid "amp;Longitude=" longitude "amp;Latitude=" latitude "amp;TerminalID=" terminalid "amp;ConnectedWiFiNAme=" wifiname "amp;TimeStamp=" timestamp "";
                String data=jparser.geturldata(url);
                Log.e("StoreUserLocation","----->" data);
                Log.e("StoreUserLocation","----->" url);
                try 
                {
                    JSONObject jobject = new JSONObject(data);
                    success=jobject.getString(WS_Constant.REGISTER.SUCCESS);
                    if(success.equals("0"))
                    {
                        message=jobject.getString(WS_Constant.REGISTER.MESSAGE);

                    }
                    else
                    {
                        message=jobject.getString(WS_Constant.REGISTER.MESSAGE);

                    }



                } 
                catch (Exception e) 
                {
                    e.printStackTrace();
                }

                return message;
            }

            @Override
            protected void onPostExecute(String result) 
            {
                Toast.makeText(getApplicationContext(),"User Location Update ",Toast.LENGTH_SHORT).show();

            }



        }

        /* Opening DB */
        private void Open_Database() 
        {
               mDB_Helper = new DB_Helper(getApplicationContext());
              mSQLiteDatabase = mDB_Helper.getWritableDatabase();

        }

        /* Closing DB */
        private void Close_Database() 
        {

            if (mSQLiteDatabase != null amp;amp; mDB_Helper != null) 
            {       
                    mSQLiteDatabase.close();
                    mDB_Helper.close();
            }

        }
    }    
}
  

ЖУРНАЛ ОШИБОК

 06-20 23:20:15.460: E/ActivityThread(10269): Service com.pingm2c.WifiScanService has leaked IntentReceiver com.pingm2c.WifiScanService$WifiReceiver@40deb568 that was originally registered here. Are you missing a call to unregisterReceiver()?
06-20 23:20:15.460: E/ActivityThread(10269): android.app.IntentReceiverLeaked: Service com.pingm2c.WifiScanService has leaked IntentReceiver com.pingm2c.WifiScanService$WifiReceiver@40deb568 that was originally registered here. Are you missing a call to unregisterReceiver()?
06-20 23:20:15.460: E/ActivityThread(10269):    at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:820)
06-20 23:20:15.460: E/ActivityThread(10269):    at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:614)
06-20 23:20:15.460: E/ActivityThread(10269):    at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1312)
06-20 23:20:15.460: E/ActivityThread(10269):    at android.app.ContextImpl.registerReceiver(ContextImpl.java:1299)
06-20 23:20:15.460: E/ActivityThread(10269):    at android.app.ContextImpl.registerReceiver(ContextImpl.java:1293)
06-20 23:20:15.460: E/ActivityThread(10269):    at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:341)
06-20 23:20:15.460: E/ActivityThread(10269):    at com.pingm2c.WifiScanService.onStartCommand(WifiScanService.java:84)
06-20 23:20:15.460: E/ActivityThread(10269):    at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2723)
06-20 23:20:15.460: E/ActivityThread(10269):    at android.app.ActivityThread.access$1900(ActivityThread.java:139)
06-20 23:20:15.460: E/ActivityThread(10269):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1335)
06-20 23:20:15.460: E/ActivityThread(10269):    at android.os.Handler.dispatchMessage(Handler.java:99)
06-20 23:20:15.460: E/ActivityThread(10269):    at android.os.Looper.loop(Looper.java:156)
06-20 23:20:15.460: E/ActivityThread(10269):    at android.app.ActivityThread.main(ActivityThread.java:5005)
06-20 23:20:15.460: E/ActivityThread(10269):    at java.lang.reflect.Method.invokeNative(Native Method)
06-20 23:20:15.460: E/ActivityThread(10269):    at java.lang.reflect.Method.invoke(Method.java:511)
06-20 23:20:15.460: E/ActivityThread(10269):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
06-20 23:20:15.460: E/ActivityThread(10269):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
06-20 23:20:15.460: E/ActivityThread(10269):    at dalvik.system.NativeStart.main(Native Method)
  

Комментарии:

1. о, извините, я этого не видел.

2. попробуйте переместить супер-вызов onDestroy ниже команды unregister.

3. происходит ли это при нажатии кнопки «вкл.»?

4. нет при нажатии на кнопку выкл.

5. Попробуйте зарегистрировать приемник в onCreate