2014-07-04 5 views
0

NEW_OUTGOING_CALL 의도 (정적 수신자)에 대한 수신자가 작성되었습니다. 시스템을 유지하지 않으려면 AsyncTask에서 프로세스의 긴 부분을 수행합니다.안드로이드 스레드가 자체적으로 시작하는 이유

전화 건 번호에 따라 AsyncTask를 시작하거나 시작하지 않을 수도 있습니다 (정규 처리 진행). 그러나 작업은 올바른 매개 변수가 전달 된 상태에서 자체적으로 시작됩니다. 나는 프로젝트를 grep했습니다. 그리고 CallOneShot 함수 외의 LongOperation에 대한 다른 호출은 없습니다. 그러나 '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); 

      } 

     } 
    } 


} 

답변

0

당신이 myprefs에 값을 할당 가지고 도움의 비트를

감사를 줄이려고 시도했습니다. 그것은 당신이 null로 초기화하고 어떤 값도 할당하지 않는 것 같습니다

+0

답장을 보내 주셔서 감사합니다. 예, 코드를 편집하여 읽기 쉽도록했습니다. 중요한 문제는 호출되지 않고 LifeOperation 인스턴스가오고 있다는 것입니다! 여기서 전체 클래스보기 : http://pastebin.com/7a7bURBi – cerien

+0

longOperation 클래스 정의를 public에서 static으로 변경하십시오. – user3806339

+0

그냥 변경 했으므로 변경되지 않습니다. 어쨌든 도와 줘서 고마워. – cerien

0

괜찮아요 - 바보 나 대답입니다 - 나는 패키지의 이름을 변경했고 패키지의 이전 버전은 여전히 ​​에뮬레이터에 있었고, 의도를 함정에 빠트 리다. 일단 내가 그것을 제거하면, 모두 정상으로 돌아갔습니다 ...

어쨌든 당신의 도움을 많이 주셔서 감사합니다.

관련 문제