2017-10-30 2 views
0

こんにちは、私は力が近い

私の問題は、私は(アプリケーションのリストからオフスワイプ)閉じたときに、受信機がもはや機能しないことである、着信コールを聞くために受信機でアプリを作ったとき、レシーバが停止。私が試した

最初にすることは、それ自体がそうのようなアンドロイドマニフェストで定義された受信機である:

<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

Androidは、マニフェストで放送するために暗黙のうちにリスナーとなるアプリについて、マシュマロ以上の変更を多く受けています。その理由は、複数のアプリがブロードキャストに登録し、登録されたアプリのすべてのブロードキャスト受信機が(非常に高価な)アプリを実行するために新しいプロセスがスピンアップし、バッテリーが消耗するからです。これを悪化させたのは、ブロードキャストレシーバの登録を解除できなかったため、ユーザーはこの動作を制御できないということでした。この問題を解決するために、Androidのエンジニアリングチームは、選択された少数の放送のみを暗黙的に登録することができます。 1つはDevice Bootのブロードキャストインテントです。アプリケーションが暗黙のうちにブロードキャストを登録するのを止めることによって、通知を受けたいインテントを聞くためにユーザーが手動でアプリを起動する必要があります。これにより、いくつかの不要なアプリが目覚めて意図を処理しようとするのを防ぎます。

「バッテリの問題」については、BroadcastRecieverをサービスに明示的に登録し、パフォーマンスを調整してできるだけパフォーマンスを向上させるための推奨パターンを使用することをお勧めします。サービスは確かに無料ではありませんが、起動して実行するだけで自動的に重いオブジェクトになるわけではありません。加えて、彼らはこの正確な目的のために存在します。あなたのサービスで不必要な作業をしないように覚えておいてください。正しいスタートを切ってください。

+0

偉大な答えは、新しいアンドロイド8はどうですか、サービスで大丈夫でしょうか? – yanivtwin

+1

@yanivtwinええ、それはAndroid 8のサービスで大丈夫でしょう。 –

1

アプリを閉じると、直接onDestroyメソッドに移動します。サービスコードでは、このメソッドを実装しました。したがって、あなたのメソッドでは、サービスをプログラム的に停止しました。要するに、あなたはそれを削除する必要があります。

+0

はい私は私の質問を編集し、ondestroyを削除し、それは動作しますが、私はサービスを常に開いたままにすることの心配をしています。 – yanivtwin

関連する問題