2017-10-30 1 views
0
가까운 힘이

안녕하세요 내가 들어오는 호출을들을 수있는 수신기와 응용 프로그램을했습니다 때 중지 . 앱을 열거 나 배경 인 경우에만수신기</p> <p>내 문제는 내가 (응용 프로그램의 목록에서 떨어져 슬쩍) 닫을 때 수신기가 더 이상 작동하지 않는다는 것입니다,

<receiver 
      android:name=".demo.CallReceiver" 
      android:exported="true" 
      android:enabled="true"> 
      <intent-filter android:priority="999"> 
       <action android:name="android.intent.action.PHONE_STATE"/> 
      </intent-filter> 
      <intent-filter android:priority="999"> 
       <action android:name="android.intent.action.NEW_OUTGOING_CALL" /> 

      </intent-filter> 
     </receiver> 

이 작동 : 내가 시도

우선과 같이 안드로이드 매니페스트에 정의 된 수신기 자체입니다.

내가 온라인 모습이보고 - (매니페스트에) https://stackoverflow.com/a/46889335/7079340 그래서 난과 같이 내 자신의 서비스를 만들어 :

<service android:name=".Service.CallService" android:enabled="true" 
    android:exported="false"> <intent-filter> 
    <action android:name="com.package.name.IRemoteConnection" /> 
</intent-filter> 
</service> 

과 클래스 :

public class CallService extends Service { 
    private static BroadcastReceiver m_Receiver; 

    @Override 
    public IBinder onBind(Intent arg0) 
    { 
     Log.e("SERVICELOG","bind"); 

     return null; 
    } 
    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Log.e("SERVICELOG","start command"); 

     return START_STICKY; 
    } 

    @Override 
    public void onCreate() 
    { 
     Log.e("SERVICELOG","create"); 

     Receiver(); 
    } 

    @Override 
    public void onDestroy() 
    { 
     Log.e("SERVICELOG","destroy"); 
     try{ 
      unregisterReceiver(m_Receiver);}catch (Exception e){ 
      Log.e("SERVICELOG"," "+e.getMessage()); 

     } 

    } 

    private void Receiver() 
    { 
     m_Receiver = new CallReceiver(); 
    } 
} 

는 그것을 시작 내 Splashscreen의 oncreate 및 로그를 인쇄하고 작동합니다! 서비스없이이 작업을 수행 할 수있는 방법은 무엇입니까? 배터리 문제가 걱정되는 등의 문제가 있습니까? 감사 !

+0

예 나는 내 질문을 편집하고 ondestroy를 제거하고 작동하지만 항상 서비스를 유지하는 데 대한 비용이 걱정됩니다. 다른 방법이 있습니까? – yanivtwin

+0

필자는 서비스가 필요할 때까지 중단해야한다고 생각합니다. 예를 들어 SMS 메시지를 수신하여 보관하려면 (어쩌면 whatsapp과 같은 앱에 알림을 제공하는 등) 메시지를 열어 둘 수 있지만 앱이 실행되는 동안 서비스를 사용하려는 경우 중지 할 수 있습니다 앱이 닫힐 때. –

+0

또한 서비스를 실행하기 위해 값이 필요하다고 가정하고, 값이 null이면 "앱이 중지되었습니다."라는 메시지를 항상 표시합니다. 내 배경 응용 프로그램 중 일부에서 그것을 경험했다. –

답변

1

안드로이드는 마스트 멜로 (Marshmallow) 이상에서 많은 변화를 겪었습니다. 그 이유는 여러 애플 리케이션이 방송을 위해 등록 할 것이고 새로운 프로세스가 등록 된 모든 앱의 브로드 캐스트 리시버가 (매우 비싼) 상태로 작동하여 배터리가 소모되기 때문입니다. 더 나쁜 것은 사용자가 방송 수신기를 등록 해제 할 수 없으므로이 동작을 제어 할 수 없다는 것입니다. 이를 해결하기 위해 안드로이드의 엔지니어링 팀은 일부 소수의 방송 만 암시 적으로 등록 할 수 있습니다. 하나는 Device Boot 브로드 캐스트 인 텐트입니다. 앱을 암묵적으로 등록하는 것을 중지함으로써 사용자는 알림을 받고자하는 의도를 듣기 위해 앱을 수동으로 시작해야합니다. 이렇게하면 몇 가지 불필요한 앱이 깨어나 의도를 처리하지 못하게됩니다.

"배터리 문제"에 관해서는 서비스에 BroadcastReciever를 명시 적으로 등록하고 선호하는 성능 패턴을 사용하여 코드가 가능한 성능을 발휘하도록하는 것이 좋습니다. 서비스는 분명히 무료는 아니지만 시작되고 실행되는 것만으로 자동으로 무거운 물건이되는 것은 아닙니다. 게다가 그들은이 정확한 목적을 위해 존재합니다. 서비스에서 불필요한 작업을 수행하지 말고 올바른 출발을해야합니다.

+0

멋진 답변, 새로운 안드로이드 8은 어떨까요? 서비스와 함께 괜찮습니까? – yanivtwin

+1

@yanivtwin 예, Android 8에서 서비스가 가능합니다. –

1

앱을 종료하면 바로 onDestroy 메쏘드로 이동합니다. 서비스 코드에서이 메소드를 구현했습니다. 따라서 메서드에서 프로그래밍 방식으로 서비스를 중단했습니다. 즉, 제거해야합니다.

+0

네, 내 질문을 편집하고 ondestroy를 제거하고 작동하지만 항상 서비스를 유지하는 데 대한 비용이 걱정됩니다. 다른 방법이 있습니까? – yanivtwin

관련 문제