2

サービスからアクティビティへのメッセージの送信に関する多数の投稿を見てきましたが、これを機能させることができません。私の受信者は決して呼び出されていません。アクティビティがフォアグラウンドになくても問題ありませんか?

これが私のシナリオです - Web サーバーをサービスとして実行しています。Web サーバーがプレイリストへのリンクを含む URL を受信したら、メディア プレーヤーとして機能しているアクティビティにメッセージを送信する必要があります。メディア プレーヤーがプレイリストを読み取り、曲、ビデオなどの再生を順番に開始します。

早送りや一時停止などのコマンドを送信する場合があるため、サービスがメディア プレーヤー アクティビティの新しいインスタンスを開始することは望ましくありません。

私のWebサーバーサービスから:

private void sendMessage() {


  Log.d("juice NonoHTTPD sender", "Sending message from Hub Web Server to Hub Player");

  Intent intent = new Intent();
  intent.putExtra(HubPlayer.ACTIVITY_PARAM_HOST, sAppHost);
  intent.putExtra(HubPlayer.ACTIVITY_PARAM_PORT, sAppPort);
  intent.putExtra(HubPlayer.ACTIVITY_PARAM_TYPE, sAppType);
  intent.putExtra(HubPlayer.ACTIVITY_PARAM_URL, sAppPath);    
  intent.setAction("com.jigawattlabs.hubplayer.play");
  appContext.sendBroadcast(intent);
}

私の活動から:

public class HubPlayer extends Activity implements
OnBufferingUpdateListener, OnCompletionListener,
OnPreparedListener, OnVideoSizeChangedListener, SurfaceHolder.Callback 
{
private IntentFilter intentFilter = new IntentFilter("com.jigawattlabs.hubplayer.play");

MyBroadcastReceiver mReceiver = new MyBroadcastReceiver();

@Override
public void onCreate(Bundle bundle) {
    super.onCreate(bundle);

    setContentView(R.layout.mediaplayer_2);

    registerReceiver(mReceiver , intentFilter);

}

public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        extras = intent.getExtras();

        sHost = extras.getString(ACTIVITY_PARAM_HOST);
        sPort = extras.getString(ACTIVITY_PARAM_PORT);
        sType = extras.getString(ACTIVITY_PARAM_TYPE);
        sXMLURL = extras.getString(ACTIVITY_PARAM_URL);

        DebugMsg("received broadcast in MyBroadcastReceiver.");
        processInputRequest();
    }
}
}

コード内で BroadcastReceiver を登録しているので、これをマニフェストに入れる必要はないようですが、インテント フィルターも追加しました。

    <activity android:label="Media Hub Player" android:launchMode="singleTask"
        android:screenOrientation="unspecified"
        android:name=".HubPlayer" >
        <intent-filter>
            <action android:name="com.jigawattlabs.hubplayer.play" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>            
    </activity> 

前もって感謝します。

4

2 に答える 2

0

常に意図を取得したい場合は、受信者にする必要があります。マニフェストで定義すると、ブロードキャスト、アクティビティが実行されているかどうかにかかわらず、常にキャプチャされます。何かのようなもの:

<receiver android:name=".StartOnUser">
    <intent-filter>
        <action android:name="android.intent.action.USER_PRESENT" />
    <category android:name="android.intent.category.HOME" />
    </intent-filter>
</receiver>
于 2013-11-17T07:26:20.807 に答える
0

OK、これには回避策がありますが、もっと良いものを期待していました。これが私がしたことです

  • サービスがアクティビティにメッセージを送信する必要がある場合、アクティビティが実行されているかどうかを確認します
  • アクティビティが実行中の場合、上記のように sendBroadcast を実行します
  • アクティビティが実行されていない場合は、StartActivity を実行し、sendBroadcast の場合と同じ情報を渡します。
  • アクティビティから、登録された BroadcastReceiver または onResume で渡されたインテント (StartActivity が呼び出された場合) からインテントを取得します。

アクティビティが実行されているかどうかを確認するコードは次のとおりです

public boolean isHubRunning() 
{ 
    boolean isServiceFound = false;

    ActivityManager activityManager = (ActivityManager)appContext.getSystemService (Context.ACTIVITY_SERVICE); 
    List<RunningTaskInfo> services = activityManager.getRunningTasks(Integer.MAX_VALUE); 
    isServiceFound = false; 
    for (int i = 0; i < services.size(); i++) 
    { 
        //DebugMsg(services.get(i).topActivity.toString());
        if (services.get(i).topActivity.toString().contains("juicemediahub.HubPlayer")) 
        {
            isServiceFound = true;
        }
    } 
    DebugMsg("Hub Player Running = " + String.valueOf(isServiceFound));
    return isServiceFound; 
} 
于 2012-05-25T14:11:00.240 に答える