Почему поток Android запускается сам по себе

#android #android-asynctask

#Android #android-asynctask

Вопрос:

Я написал приемник для намерения NEW_OUTGOING_CALL (статический приемник). Чтобы не задерживать систему, я выполняю длительную часть процесса в AsyncTask.

В зависимости от набранного номера я могу запустить AsyncTask (и продолжить обычную обработку), а могу и не запускать. Однако задачи запускаются сами по себе, с переданным правильным параметром, и я не могу понять, как!! Я обработал проект grep, и нет других вызовов LongOperation, кроме того, что в функции CallOneShot — но трассировки, окружающие оператор ‘new’, не отображаются.

Как это может произойти?

Пожалуйста, найдите прилагаемый код, извините за длину, я попытался его немного сократить

Спасибо за помощь J.

 package com.iper.phoneeco;



public class MyReceiver extends BroadcastReceiver {
private static final String TAG = "XXBroadcastReceiver";

FileWriter fDevLog;
MyPrefs myprefs=null;
public final static String EXTRA_MESSAGE = "com.iper.phoneeco.msg1";

   @Override
   public void onReceive(Context context, Intent intent) {

       if(intent.getAction().equalsIgnoreCase("android.intent.action.NEW_OUTGOING_CALL"))
       {
        Log.d(TAG,"OUTGOING CALL RECEIVED");
        String phoneNumber = getResultData();
           if (phoneNumber == null) {
             // No reformatted number, use the original
             phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
           }
           Log.d(TAG,"phone number:" phoneNumber);


           if (IsToProcess(phoneNumber)) {

               Log.d (TAG,"Trapping the call");

              // Lets Roll
              CallOneShot(phoneNumber);

              // and prevent other apps from calling as well
              setResultData(null);
              // abortBroadcast();

          }
          else { 
              Log.d (TAG,"Standard processing");
              Toast.makeText(context, "standard processing"     , Toast.LENGTH_LONG).show();
          }

  Log.d (TAG,"Finished processing intent");

   }

    // 
    // check is number against a list of exceptions, that we dont handle
    //
    private boolean IsToProcess(String num){
        String[] excluded = {"15","17","18","112","911","991","08.*","^\*.*","^#.*"};
        for (String ex : excluded){
             Log.d(TAG,"Exclusion test: " ex   "versus: " num);
            if (num.matches(ex)) {
                Log.d(TAG,"Exclusion FOUND: " ex);
                return false;
            }
        }
        if (num.length() < myprefs.minLen) {
            Log.d(TAG,"Exclusion FOUND: Numero trop court");
                return false;
        }
        Log.d(TAG,"Exclusion not found: ");

        return true;
    }

    //
    // Displays a toast
    //
    void MyToast(String s, int col, int dur ) {
        Toast toast=Toast.makeText(myprefs.ctx, s, dur);
        toast.setGravity(Gravity.CENTER_HORIZONTAL, 0, 0);
        toast.getView().setBackgroundColor(col );
        LinearLayout toastLayout = (LinearLayout) toast.getView();
        TextView toastTV = (TextView) toastLayout.getChildAt(0);
        toastTV.setTextSize(20);
        toast.show();

    }
    void MyToast(String s, int col) {
        MyToast(s,col,Toast.LENGTH_LONG);
    }

    public void CallOneShot(String phoneNumber) {
      Log.d (TAG,"CallOneShot");
      MyToast (myprefs.ctx.getResources().getString(R.string.callbackipg) " " phoneNumber,Color.BLUE);
      new LongOperation().execute(phoneNumber);

    }
    // 
    // the meat....
    //
    public class LongOperation extends AsyncTask<String, Void, String> {
        String numToCall;

        @Override
        protected String doInBackground(String... params) {         


            int bytesRead;
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(1024);
            byte[] buffer = new byte[1024];
            String msgres;
            String response;

            Log.d(TAG, "Clientthread started");
            numToCall=params[0];
            Log.d(TAG, "numTocall" numToCall);

            // and add to the call log

            ContentValues values = new ContentValues();
            values.put(CallLog.Calls.NUMBER, numToCall);
            values.put(CallLog.Calls.DATE, System.currentTimeMillis());
            values.put(CallLog.Calls.DURATION, 0);
            values.put(CallLog.Calls.TYPE, CallLog.Calls.OUTGOING_TYPE);
            values.put(CallLog.Calls.NEW, 1);
            values.put(CallLog.Calls.CACHED_NAME, ""); 
            values.put(CallLog.Calls.CACHED_NUMBER_TYPE, 0);
            values.put(CallLog.Calls.CACHED_NUMBER_LABEL, "");
            Log.d(TAG, "Inserting call log placeholder for "   numToCall);
            ContentResolver resolver = myprefs.ctx.getContentResolver();
            resolver.insert(CallLog.Calls.CONTENT_URI, values);

            response=myprefs.ctx.getResources().getString(R.string.errundef);
            return response;
        }

        protected void onPostExecute (String s) {
            if (!s.equals("ok")) {
                Log.d(TAG,"OnPostExecute - failed: " s);
                MyToast (myprefs.ctx.getResources().getString(R.string.errcallback) "n" s,Color.RED);

            }

        }
    }


}
  

Ответ №1:

Вы присвоили значение myprefs. Кажется, что вы инициализировали его равным null и никогда не присваиваете ему какое-либо значение

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

1. спасибо за ответ. Да, я отредактировал код, чтобы он выглядел более удобным для чтения. Ключевая проблема заключается в том, что экземпляр LongOperation оживает без вызова! Смотрите полный класс здесь: pastebin.com/7a7bURBi

2. Измените определение класса longOperation с общедоступного на статический

3. Просто сделал это, и это не меняется. В любом случае спасибо за помощь

Ответ №2:

ок — ответ «глупый я» — я изменил название пакета, и старая версия пакета все еще была в эмуляторе, перехватывая намерение! как только я удалил его, все вернулось к нормальной жизни…

В любом случае большое спасибо за вашу помощь