START_STICKYを使用した後でも、サービスが常に実行されているわけではありません

バーラト

問題

START_STICKYを使用した後でも、サービスが常に実行されているわけではありません。

発信通話のトーストアクションが表示されないことがありますが、それはサービスがしばらくすると停止することを意味しますか?

私の要件

アプリケーションは、ユーザーが電話から発信するたびにトーストを表示します。このために、BroadcastReceiverを使用して、呼び出しアクションとサービスをタップしています(Receiverを常に実行するため)。このアクティビティを開始すると、発信コールが開始されるとトーストが表示され始めますが、常にではありません。

以下は完全なコードです-

MainActivity.class

public class MainActivity extends Activity 
{
    CallNotifierService m_service;
    boolean isBound = false;

    private ServiceConnection m_serviceConnection = new ServiceConnection() 
    {
        @Override
        public void onServiceConnected(ComponentName className, IBinder service) 
        {
            m_service = ((CallNotifierService.MyBinder)service).getService();
            Toast.makeText(MainActivity.this, "Service Connected", Toast.LENGTH_LONG).show();
            isBound = true;
            Intent intent = new Intent(MainActivity.this, CallNotifierService.class);
            startService(intent);
        }

        @Override
        public void onServiceDisconnected(ComponentName className) 
        {
            m_service = null;
            isBound = false;
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Intent intent = new Intent(this, CallNotifierService.class);
        bindService(intent, m_serviceConnection, Context.BIND_AUTO_CREATE);
    }
    .
    .
    .
}

CallNotifierService.class

public class CallNotifierService extends Service 
{
    private final IBinder myBinder = new MyBinder();
    private static final String ACTION_OUTGOING_CALL = "android.intent.action.NEW_OUTGOING_CALL";

    private CallBr br_call;

    @Override
    public IBinder onBind(Intent arg0) 
    {
        return myBinder;
    }

    @Override
    public void onDestroy() 
    {
        Log.d("service", "destroy");
        this.unregisterReceiver(this.br_call);
        Toast.makeText(CallNotifierService.this, "Receiver Un-Registered", Toast.LENGTH_LONG).show();
        super.onDestroy();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId)
    {
        final IntentFilter filter = new IntentFilter();
        filter.addAction(ACTION_OUTGOING_CALL);
        this.br_call = new CallBr();
        this.registerReceiver(this.br_call, filter);
        Toast.makeText(CallNotifierService.this, "onStartCommand Called", Toast.LENGTH_LONG).show();
        return START_STICKY;
    }

    public class MyBinder extends Binder 
    {
        CallNotifierService getService() 
        {
            return CallNotifierService.this;
        }
    }

    public class CallBr extends BroadcastReceiver 
    {
        public CallBr() {}

        @Override
        public void onReceive(Context context, Intent intent) 
        {
            Toast.makeText(context, "Action:"+intent.getAction(), Toast.LENGTH_LONG).show();
        }
    }
}
personne3000

ここでは、単純なアイデア(正しく実行されれば機能する)とより複雑なアイデア(機能しない)を組み合わせることで、間違ったアプローチをとっています。

注意:START_STICKYを使用している場合でも、サービスは「常に実行中」のコンポーネントはありません

Androidシステムは、どこか別の場所にメモリが必要な場合、サービスを強制終了することを躊躇しません。START_STICKYは、ドキュメントで指定されているようにonStartCommandを呼び出して、Androidシステムが可能な場合にサービスを再起動することを意味するだけです。

本当に固執するサービスが必要な場合は、フォアグラウンドサービスを使用する必要がありますただし、UI(迷惑な通知アイコンが常に表示される)とバッテリー寿命に影響するため、ここでは必要ありません。

これが手品です。BroadcastReceiverが機能するためにアプリを実行する必要はありませんあなたがする必要があるのは正しいintent-filterであなたのAndroidManifest.xmlにそれを登録することです:

<receiver android:name=".broadcastreceivers.CallBroadcastReceiver">
    <intent-filter>
        <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
    </intent-filter>
</receiver>

(また、アプリに必要な権限、つまりPROCESS_OUTGOING_CALLSがあることを確認してください)。

次に、コードに必要なのは次のとおりです。

public class CallBroadcastReceiver extends BroadcastReceiver 
{
    @Override
    public void onReceive(Context context, Intent intent) 
    {
        Toast.makeText(context, "Action: " + intent.getAction(), Toast.LENGTH_LONG).show();
    }
}

アクティビティなし(Android 6以降でPROCESS_OUTGOING_CALLS権限を要求する場合を除く)、サービスなし、何もありません。シンプルでバッテリー効率が良い!

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

一部のデバイスでSTART_STICKYを使用しても、アプリを強制終了した後、サービスが再開されない

分類Dev

フラッターは常にWindowsで実行されているわけではありません

分類Dev

カードビューの最後の行がすべてのデバイスに表示されているわけではありません

分類Dev

TaskScheduler.Defaultは、タスクがプールスレッドで実行されることを常に保証するわけではありませんか?

分類Dev

RPMをインストールしても、.specにリストされているすべての%installアクションが実行されるわけではありません。

分類Dev

START_STICKYを使用してもAndroidがサービスを再作成しない

分類Dev

ios-simから単体テストを起動しても、すべてのテストが実行されるわけではありません

分類Dev

Seleniumは、要素がDOMから削除されたことを常に認識しているわけではありません

分類Dev

openTSDBサービスがポート4242で稼働しているにもかかわらず、コマンド、つまりmkmetricを実行できません。

分類Dev

別のIFステートメントに囲まれたvb.netIFステートメントは常にtrueを返し、条件がfalseを指している場合でも「false」コードを実行することはありません。

分類Dev

multiがtrueに設定されていても、MongoDBがすべてのレコードを更新しているわけではありません

分類Dev

リサイクルビューにすべてが表示されたわけではありません

分類Dev

ファイル作成アクションを使用したMicrosoftFlowが常にトリガーされるわけではありません

分類Dev

pandas to_sqlとpyhiveを使用してテーブルを置き換えると、実行に失敗しました-DatabaseError: "...文字列のフォーマット中にすべての引数が変換されたわけではありません"

分類Dev

Webページとして保存-リストはULまたはOLhtmlタグで常に保存されるわけではありません

分類Dev

サーバーに接続できませんでした:接続が拒否されましたサーバーはホスト「127.0.0.1」で実行されており、ポート5432でTCP / IP接続を受け入れていますか?

分類Dev

最後の関数が実行された後もコードを実行し続ける方法、意味がない場合はこの申し訳ありませんが初心者です

分類Dev

Xamarin Android の VSTS ビルド定義が常に失敗し、「サポートされているタスク実行ハンドラーが見つかりませんでした。T...」というエラーが表示されます。

分類Dev

WebページのCSSアニメーションボタンがすべてのアニメーションを実行しているわけではありません(Javascriptを介してページに追加されたボタン)

分類Dev

こんにちは、私はphpを使用してPythonスクリプトを実行していますが、他のページも埋め込んでいるため、ボタンがクリックされたときにページを更新したくありません

分類Dev

サービスでfindViewByIdを使用できません。LayoutInflaterを使用しましたが、助けにはなりませんでした。値が表示されていません

分類Dev

Kafkaでメッセージを一度処理する方法。サービスを再起動してもすべてのメッセージが処理されるわけではありません。

分類Dev

関数は、すべてのコードパスで値を返すわけではありません。結果が使用されると、実行時にnull参照例外が発生する可能性があります

分類Dev

すべてのステートメントがfor ... inループで実行されているわけではありません

分類Dev

コードネーム1つのアプリをアンインストールしても、すべてのデータが常に削除されるわけではありません

分類Dev

phpをmysqlにリンクした後でも、adminerでサポートされているPHP拡張機能はありません

分類Dev

CORSを使用している場合、MulleでHTTPPOSTリクエストメッセージが毎回受信されるわけではありません

分類Dev

ビューを作成できませんが、それ以外の場合、ステートメントは正常に実行されています。各ビューまたは関数の列名は一意である必要があります

分類Dev

Pythonの応答-すべてのリクエストが実行されたわけではありません

Related 関連記事

  1. 1

    一部のデバイスでSTART_STICKYを使用しても、アプリを強制終了した後、サービスが再開されない

  2. 2

    フラッターは常にWindowsで実行されているわけではありません

  3. 3

    カードビューの最後の行がすべてのデバイスに表示されているわけではありません

  4. 4

    TaskScheduler.Defaultは、タスクがプールスレッドで実行されることを常に保証するわけではありませんか?

  5. 5

    RPMをインストールしても、.specにリストされているすべての%installアクションが実行されるわけではありません。

  6. 6

    START_STICKYを使用してもAndroidがサービスを再作成しない

  7. 7

    ios-simから単体テストを起動しても、すべてのテストが実行されるわけではありません

  8. 8

    Seleniumは、要素がDOMから削除されたことを常に認識しているわけではありません

  9. 9

    openTSDBサービスがポート4242で稼働しているにもかかわらず、コマンド、つまりmkmetricを実行できません。

  10. 10

    別のIFステートメントに囲まれたvb.netIFステートメントは常にtrueを返し、条件がfalseを指している場合でも「false」コードを実行することはありません。

  11. 11

    multiがtrueに設定されていても、MongoDBがすべてのレコードを更新しているわけではありません

  12. 12

    リサイクルビューにすべてが表示されたわけではありません

  13. 13

    ファイル作成アクションを使用したMicrosoftFlowが常にトリガーされるわけではありません

  14. 14

    pandas to_sqlとpyhiveを使用してテーブルを置き換えると、実行に失敗しました-DatabaseError: "...文字列のフォーマット中にすべての引数が変換されたわけではありません"

  15. 15

    Webページとして保存-リストはULまたはOLhtmlタグで常に保存されるわけではありません

  16. 16

    サーバーに接続できませんでした:接続が拒否されましたサーバーはホスト「127.0.0.1」で実行されており、ポート5432でTCP / IP接続を受け入れていますか?

  17. 17

    最後の関数が実行された後もコードを実行し続ける方法、意味がない場合はこの申し訳ありませんが初心者です

  18. 18

    Xamarin Android の VSTS ビルド定義が常に失敗し、「サポートされているタスク実行ハンドラーが見つかりませんでした。T...」というエラーが表示されます。

  19. 19

    WebページのCSSアニメーションボタンがすべてのアニメーションを実行しているわけではありません(Javascriptを介してページに追加されたボタン)

  20. 20

    こんにちは、私はphpを使用してPythonスクリプトを実行していますが、他のページも埋め込んでいるため、ボタンがクリックされたときにページを更新したくありません

  21. 21

    サービスでfindViewByIdを使用できません。LayoutInflaterを使用しましたが、助けにはなりませんでした。値が表示されていません

  22. 22

    Kafkaでメッセージを一度処理する方法。サービスを再起動してもすべてのメッセージが処理されるわけではありません。

  23. 23

    関数は、すべてのコードパスで値を返すわけではありません。結果が使用されると、実行時にnull参照例外が発生する可能性があります

  24. 24

    すべてのステートメントがfor ... inループで実行されているわけではありません

  25. 25

    コードネーム1つのアプリをアンインストールしても、すべてのデータが常に削除されるわけではありません

  26. 26

    phpをmysqlにリンクした後でも、adminerでサポートされているPHP拡張機能はありません

  27. 27

    CORSを使用している場合、MulleでHTTPPOSTリクエストメッセージが毎回受信されるわけではありません

  28. 28

    ビューを作成できませんが、それ以外の場合、ステートメントは正常に実行されています。各ビューまたは関数の列名は一意である必要があります

  29. 29

    Pythonの応答-すべてのリクエストが実行されたわけではありません

ホットタグ

アーカイブ