2015-07-11 69 views
1

我知道這是與我的類似的問題。 https://stackoverflow.com/a/22511290/2208342 但我已經讀過這個問題的解決方案將被淘汰,因爲Android正在取代該代碼。下面檢查服務是否從Broadcast Reciever內部運行

qoute從https://stackoverflow.com/a/5921190/2208342

採取我會建議使用此解決方案。對於Android L,他們正在刪除ActivityManager.getRecentTasks(),並且它在文檔中有相同的註釋。所以要警告!

我也聽說這個解決方案不適用於android kitkat。

廣播接收器類

public class IncomingSms extends BroadcastReceiver { 

final SmsManager sms = SmsManager.getDefault(); 


public IncomingSms(){} 


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

    final Bundle bundle = intent.getExtras(); 

    Intent intent1 = new Intent(context, CallDetectService.class); 



    if (context.stopService(intent1)) { 
     Toast.makeText(context,"if context",Toast.LENGTH_LONG).show(); 
     try { 


      if (bundle != null) { 

       final Object[] pdusObj = (Object[]) bundle.get("pdus"); 

       for (int i = 0; i < pdusObj.length; i++) { 

        SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]); 
        String phoneNumber = currentMessage.getDisplayOriginatingAddress(); 

        String senderNum = phoneNumber; 
        String message = currentMessage.getDisplayMessageBody(); 


        String sms = "TEST"; 
        try { 
         SmsManager smsManager = SmsManager.getDefault(); 
         smsManager.sendTextMessage(senderNum, null, sms, null, null); 

         Toast.makeText(context, "Sms sent Succesfully", Toast.LENGTH_LONG).show(); 

        } catch (Exception e) { 
         e.printStackTrace(); 
         Toast.makeText(context, "Sms Failed", Toast.LENGTH_LONG).show(); 
        } 


        Log.i("SmsReciver", "senderNum: " + senderNum + "; message: " + message); 

        // Show Alert 
        int duration = Toast.LENGTH_LONG; 
        Toast toast = Toast.makeText(context, "senderNum: " + senderNum + ", message: " + message, duration); 
        toast.show(); 

       } // End For loop 
      } // bundle is null 

     } catch (Exception e) { 
      Log.e("SmsReciever", "Exeption smsReceiver" + e); 
     } 
    } 
    else{ 
     Toast.makeText(context,"else context",Toast.LENGTH_LONG).show(); 
    } 

} 
} 

服務類

public class CallDetectService extends Service { 


private CallHelper callHelper; 

public CallDetectService() { 
} 


@Override 
public int onStartCommand(Intent intent, int flags, int startId){ 
    callHelper = new CallHelper(this); 


    int res = super.onStartCommand(intent, flags, startId); 
    callHelper.start(); 
    Toast.makeText(getApplicationContext(), "Starting Service", Toast.LENGTH_LONG).show(); 

    return res; 
    } 

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


    callHelper.stop(); 
    //Toast.makeText(getApplicationContext(),"Stop Service",Toast.LENGTH_LONG).show(); 


} 

@Override 
public IBinder onBind (Intent intent) { 
     return null; 
} 
} 
在我的MainActivity

我有這樣的一段代碼,而這正是我想在我的廣播接收器。

Intent intent = new Intent(this,CallDetectService.class); 

    if (stopService(intent)){ 

回答

0

有一種變通方法,但只有如果您正在使用您的活動的接收器:

  • 添加接收機類的內部類中的活性

    public final class MyActivity extends Activity { 
        public final class IncomingSms extends BroadcastReceiver { 
         ... 
    } 
    
  • 寄存器/在活動中動態註銷接收器onStart()/onStop()
  • 擁有您的活動讓你的服務的,只要你在你的接收機onReceive()綁定到該服務
  • 使用參考參考

注意

但請記住,以上工具帶有一些缺陷:

  • 內部類具有顯式訪問任何外部類成員變量(字段和方法)
  • 這將打開一個潛在的內存泄漏前,特別是如果你的服務是在一個單獨的線程做一些
  • 你的接收機活着而存在活動
+0

謝謝。我如何註冊/取消註冊收件人以及如何參考服務。如果我的服務正在運行,我希望廣播接收機處於開啓狀態,如果服務未運行,我希望廣播接收機關閉。 –

+0

請詳細說明提供服務的邏輯:1)開啓/關閉服務時需要監聽2)當我的應用切換到開啓模式(服務運行時)時,您需要接收器 –

+0

究竟是什麼。任何傳入的短信將自動回覆短信。當我的應用程序切換到關閉模式(服務未運行時)。我不希望傳入的短信被自動回覆。 –

相關問題