問題タブ [android-service-binding]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - 開始されたサービスへのバインド
startService() で開始し、bindService() でバインドするリモート サービスがあります。これを行うのは、ユーザーがスワイプでアクティビティを閉じた場合でも、アプリが明示的にサービスを停止するまでサービスをバックグラウンドで実行するためです。サービスの関連部分は次のとおりです。
アクティビティは次のとおりです。
サービスのマニフェストは次のとおりです。
startService() と bindService() を介してデバッガーでこれを段階的に実行すると、すべて問題ありません。サービス内では、onStartCommand() が呼び出され、続いて onBind() が呼び出されます。アクティビティでは、onServiceConnected() が Binder で呼び出されます。ただし、デバッグしていないときは、何らかの理由で Service が onBind() メソッドを onStartCommand() メソッドの前に呼び出します。ログからの出力は次のとおりです。
アクティビティの onServiceConnected() メソッドが呼び出されることはありません。bindService() 呼び出しで BIND_AUTO_CREATE を使用しようとしましたが、効果がありませんでした。ここである種の競合状態が発生していることは明らかですが、これをおそらく 20 回実行しましたが、常に同じ順序で表示されます。Service で呼び出しの正しい順序を強制するために考えられる唯一の方法は、BroadcastReceiver を Activity に配置し、Service の onStartCommand() メソッドから Intent を送信して、bindService( を呼び出す時間であることを Activity に知らせることです。 )。それはかなり不器用に思えます...これを行うより良い方法はありますか? または、順不同の呼び出しを引き起こしている何かが欠けていますか?
android - Android: バインドされた複数のクライアントは、サービスを停止するために複数の「戻る」必要があります
Bound Service を学習するためのサンプル アプリがあります。起動時の通知を設定します。通知をクリックしてアプリをN回起動した場合、アプリを閉じてサービスを停止するには、「戻る」ボタンをN回クリックする必要があります。「戻る」を 1 回クリックすると、アプリが停止します。http://developer.android.com/guide/components/bound-services.htmlの Android デベロッパー ガイドから: 「一度に複数のクライアントがサービスに接続できます。ただし、システムはサービスの onBind() メソッドを呼び出して、最初のクライアントがバインドする場合にのみ IBinder を取得します。その後、システムは、同じ IBinder をバインドする追加のクライアントに配信しますが、呼び出しは行われません。最後のクライアントがサービスからバインドを解除すると、システムはサービスを破棄します (サービスが startService() によって開始された場合を除く)。そのため、通知をクリックするたびに別のクライアントがバインドされ、次にバインドを解除する必要があると想定しています。この望ましくない動作を取り除くにはどうすればよいですか?
関連コード:
java - サービスのオブジェクトを MyActivity に渡すには?
まず第一に、私は Android プログラミングの経験が豊富です
Service を使用して単純な TCP Socket を作成しました。
MainActivity
ボタンがトリガーされると、クライアントはサーバーに接続します。
今、サービスのPrintWriter
オブジェクトをMainActivity
使用してオブジェクトを作成したいと思いSocket
ます。
JSONService
を使用してから にオブジェクトを渡すことができることを知りました。Activity
インターネットで検索しましたが、どうすれば合格できるのかわかりませんでした。
オブジェクトを渡す簡単なコード例を教えてください。
MyService.java
MainActivity.java
Socket
ここで、MyService.java (この場合はオブジェクトIe を渡す方法clientsocket
) と MainActivity.java (渡されたオブジェクト Ie を取得し、それを使用してオブジェクト clientsocket
を作成する方法)の両方の明確で完全なコードが必要です。 PrintWriter
android - u10_system ユーザー ID を持つ Android サービス
これは、複数のアカウント機能が有効になっている Android Kitkat/Lollipop の下にあります。ユーザー ID「system」でサービスを作成し、そのサービスにアクティビティをバインドしました。次に、別のユーザー アカウントで、別のアクティビティを同じサービスにバインドしようとしました (フラグ Context.BIND_AUTO_CREATE を使用)。アクティビティがユーザー ID「system」の既存のサービスにバインドされることを期待していました。ただし、Android はユーザー ID「u10_system」で新しいサービスを作成しました。なぜこれが起こるのでしょうか?ユーザーIDが「system」の既存のサービスにバインドできますか?
編集:サービスの場合、次の属性がありました: android:singleUser="true". このサービスには、INTERACT_ACCROSS_USERS 権限もあります。
android - Android、バックグラウンド スレッドが停止するのはなぜですか?
MainActivity は onCreate で TestService を開始し、onStart メソッドでバインドします。AsyncThread は TestService onStartCommand で開始されます。bind メソッドと unbind メソッドは正しい順序で呼び出されます。すべてが完全に機能し、まったく問題ありません:)。
問題はここから始まります: MainActivity が終了すると、実行中の非同期スレッドも中断例外なしで停止しますが、TestService はまだ実行中であり、実行中のアプリケーション設定で確認できます。スレッドが機能しなくなる理由を見つけるのを手伝ってください。
PS: Thread/Handler とクロスチェックしましたが、結果は同じです。
MainActivity と Service コードは次のとおりです。
android-service - Androidのローカルにバインドされたサービスに実装された関数によって返されるNullpointer
私はアンドロイドでローカルにバインドされたサービスを書いています.Myアプリケーションには2つのクラスがあります。アクティビティとサービス
私のアクティビティには、1 つの TextView と 1 つのボタンがあります。アクティビティの onCreate() メソッドでサービスを開始してバインドしています。ボタンがクリックされたときに、Service クラスに記述された関数から返された文字列値で TextView を更新したい
しかし、戻り値として常に null を取得しています。何が問題なのですか?
ここにコード全体を示します
アクティビティクラスです
}
そして、私のサービスクラスは次のとおりです
}; }
java - bindService / unbindService 呼び出しを完全にペアにする必要がありますか?
すべてのコード例から、#bindService を呼び出した場合にのみ (同じコンテキストで) #unbindService を呼び出したいことがわかります。これはブール値チェックによって実行されます。
ただし、 #bindService 呼び出しには同様のチェックはありません。つまり、「二重バインディング」を避けるために、最初に既にバインドされているかどうかをチェックしません。
だから私の質問 -
- サービスを複数回バインドし、バインドを解除するのは 1 回だけの場合、またはバインドを 1 回行ってバインドを解除するのは 1 回だけだと、「悪いことが起こりますか?」このような非対称性は私には奇妙に思えますが、誰かが答えを知っているかどうかを知りたいと思っていました. 私は今、それを理解しようとして自分で遊んでいますが、より経験豊富な開発者からの「公式」の回答を好むでしょう。
- 「バインド」および「バインド解除」操作と見なされるのは、単に #bind (または #unbind) API を呼び出したという事実であり、これらの呼び出しをペアにする必要があるか、またはによって示されるバインド/バインド解除状態です。 #onServiceConnected/Disconnected コールバックをペアにする必要がありますか? Google自身の例は、前者が真実であることを示しているようですが、誰か確認できますか? 前者が true の場合、最後のより微妙な質問: #bindService が false を返す場合、つまり android はサービスを解決できないため接続を試みません。その場合、#unbindService を呼び出しても安全ですか?
ありがとうございました。