私はアンドロイドプラットフォームの初心者です。現在、ストリーミング ラジオ アプリケーションに取り組んでいます。
アプリケーションを作成したいのですが、オーディオの再生を開始し、アプリケーションがバックグラウンドになっても再生を続けます。
アプリケーションがバックグラウンドに移行しても再生が継続されるように、startService()を使用してサービスを作成しました。また、bindService()を使用して serviceConnection 参照を取得し、サービスで RPC 呼び出しを実行しました。
アプリケーションはサービスを開始し、再生は正しく開始され、bindService は参照を取得して RPC 呼び出しを行うことができます。アプリがバックグラウンドに移行するまで、すべて正常に動作します。
メインアクティビティの onResume ()とonPause()で bindService( )とunBindService()呼び出しを呼び出しています。
アプリがバックグラウンドに移行すると、問題なく再生が続行されます。unBindservice()呼び出しでサービス接続を切り離し、 Service クラスでonUnbind(Intent)メソッドが呼び出されます。今のところ問題ありません。
アプリケーションがフォアグラウンドになると (サービスが実行され、再生が継続している間)、bindService() がアクティビティの onResume() メソッドで呼び出されていても、サービス接続の参照が取得されません ( onServiceConnected ( )が呼び出されません) 。サービス クラスのonBind(Intent)メソッドも呼び出されないことも確認しました。
過去数日間、この問題に苦しんでいます。
ユーザー定義の Android サービスでstartService()およびbindService()を使用するための推奨されるアプローチは何ですか。
この問題を解決するための助けをいただければ幸いです。
アクティビティ onResume/onPause コード。
@Override
public void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "onCreate => " + getIntent());
super.onCreate(savedInstanceState);
// set the default network preference, if it is not already set
setDefaultNetwork();
// initialize the navigation tab bars
initializeTabBar();
mPlayerController = AudioPlayerController.getInstance(this);
mActionBar.setDisplayShowHomeEnabled(true);
mActionBar.setDisplayShowTitleEnabled(true);
mRemoteControlReceiver = new RemoteControlReceiver();
IntentFilter filter = new IntentFilter(
"android.intent.action.MEDIA_BUTTON");
registerReceiver(mRemoteControlReceiver, filter);
setVolumeControlStream(AudioManager.STREAM_MUSIC);
}
@Override
public void onResume() {
super.onResume();
Log.d(TAG,"onResume");
mPlayerController.bindService();
restoreAppState();
}
@Override
public void onPause() {
super.onPause();
Log.d(TAG,"onPause");
mPlayerController.unBindService();
storeAppState();
}
コントローラー クラスには、サービス関連の開始/停止/バインド/バインド解除メソッドがあります
public void bindService() {
Intent intent = new Intent();
intent.setClassName("com.vikkrithik.radio.indradio",
"com.vikkrithik.radio.indradio.AudioPlayerService");
Log.d(TAG, "bindService Context " + mPlayerContext
+ " serviceConnection => " + audioServiceConnection);
mPlayerContext.bindService(intent, audioServiceConnection, 0);
}
public void unBindService() {
mPlayerContext.unbindService(audioServiceConnection);
Log.d(TAG, "unBindService done context => " + mPlayerContext
+ " serviceConnection => " + audioServiceConnection);
}
private ServiceConnection audioServiceConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName name, IBinder service) {
Log.d(TAG, "onServiceConnected " + name);
mAudioService = AudioPlayerServiceInterface.Stub
.asInterface(service);
}
public void onServiceDisconnected(ComponentName name) {
Log.d(TAG, "onServiceDisconnected " + name);
mAudioService = null;
}
};
/**
* Start the AudioService
*
*/
public void startAudioService(Station station) {
Intent intent = new Intent();
intent.setClassName("com.vikkrithik.radio.indradio",
"com.vikkrithik.radio.indradio.AudioPlayerService");
Bundle extras = new Bundle();
extras.putString("station_url", station.getUrl());
extras.putString("station_name", station.getStationName());
intent.putExtras(extras);
mCurrentStation = station;
mPlayerContext.startService(intent);
bindService();
Log.d(TAG, "startService called");
}
public void stopAudioService() {
//
// Check if AudioService is already created
//
if (null == mAudioService)
return;
Intent intent = new Intent();
intent.setClassName("com.vikkrithik.radio.indradio",
"com.vikkrithik.radio.indradio.AudioPlayerService");
mPlayerContext.stopService(intent);
Log.d(TAG, "stopAudioService done");
}
サービス クラス メソッド
@Override
public IBinder onBind(Intent arg0) {
Log.d(TAG, "onBind invoked");
return audioServiceStub;
}
@Override
public boolean onUnbind(Intent intent) {
Log.d(TAG,"onUnbind invoked");
return super.onUnbind(intent);
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate");
audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
mNetworkStatusReceiver = new NetworkStatusReceiver();
IntentFilter filter = new IntentFilter(
ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(mNetworkStatusReceiver, filter);
PreferenceManager.getDefaultSharedPreferences(this)
.registerOnSharedPreferenceChangeListener(
mNetworkStatusReceiver);
}
@Override
public void onDestroy() {
Log.d(TAG, "onDestory");
stopPlayback();
PreferenceManager.getDefaultSharedPreferences(this)
.unregisterOnSharedPreferenceChangeListener(
mNetworkStatusReceiver);
unregisterReceiver(mNetworkStatusReceiver);
cancelNotification();
audioServiceStub = null;
super.onDestroy();
}
Logcat 出力
アプリ起動時
TabbarMainActivity (15432): onResume AudioPlayerController (15432): bindService コンテキスト com.vikkrithik.radio.indradio.TabbarMainActivity@4150fdb8 serviceConnection => com.vikkrithik.radio.indradio.AudioPlayerController$1@418a2d30
再生ボタンを押したとき
AudioPlayerController (15432): bindService コンテキスト com.vikkrithik.radio.indradio.TabbarMainActivity@4150fdb8 serviceConnection => com.vikkrithik.radio.indradio.AudioPlayerController$1@418a2d30
AudioPlayerController(15432): startService が呼び出されました
AudioPlayerService(15432): onCreate
AudioPlayerService(15432): onBind が呼び出されました onBind() が呼び出されました
AudioPlayerService(15432): onStartCommand with IndetntIntent { cmp=xxxx (エクストラあり) }
AudioPlayerController (15432): onServiceConnected ComponentInfo{com.vikkrithik.radio.indradio/com.vikkrithik.radio.indradio.AudioPlayerService} onServiceConnected が呼び出されました
戻るボタンを押すと、アプリはバックグラウンドに移行します
TabbarMainActivity(15432): 終了の呼び出し
TabbarMainActivity(15432): onPause
AudioPlayerController(15432): unBindService 完了コンテキスト => com.vikkrithik.radio.indradio.TabbarMainActivity@4150fdb8 serviceConnection => com.vikkrithik.radio.indradio.AudioPlayerController$1@418a2d30 onPause() が unBindService() を呼び出します
AudioPlayerService(15432): onUnbind が unBind を呼び出しました Service で呼び出されました
TabbarMainActivity(15432): onDestroy
アプリがフォアグラウンドになる
TabbarMainActivity(15432): onCreate => インテント { cmp=xxxx }
TabbarMainActivity(15432): onResume bindService が onResume から呼び出されます
AudioPlayerController (15432): bindService コンテキスト com.vikkrithik.radio.indradio.TabbarMainActivity@4150fdb8 serviceConnection => com.vikkrithik.radio.indradio.AudioPlayerController$1@418a2d30
再生停止後
AudioPlayerService(15432): 停止
AudioPlayerService(15432): リセット
AudioPlayerController(15432): stopAudioService 完了
AudioPlayerFragment(15432): removeVisualizer
AudioPlayerService(15432): onDestory