6

Intent サービスを呼び出しているアップロードのアクティビティがあります。そこでは、API リクエストの呼び出しを処理しています。

アップロード タグを表示するために、サービスが実行されているかどうかをアクティビティに知らせたい。

サービスが実行されているかどうかを判断するために、次のことを試しました。

public void startUploadServiceTask() {
    if (Util.isNetworkAvailable(mContext)) {

        if (!isMyServiceRunning(UploadDriveService.class)) {

                startService(new Intent(mContext,
                        UploadService.class));

            }
        } else {
            Toast.makeText(mContext,
                    "Service is already running.", Toast.LENGTH_SHORT)
                    .show();
        }
    } else {
        Toast.makeText(mContext,
                getString(R.string.please_check_internet_connection),
                Toast.LENGTH_SHORT).show();
    }
}



private boolean isMyServiceRunning(Class<?> serviceClass) {
    ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    for (RunningServiceInfo service : manager
            .getRunningServices(Integer.MAX_VALUE)) {
        Log.e("ALL SERVICE", service.service.getClassName().toString());
        if (serviceClass.getName().equals(service.service.getClassName())) {

            return true;
        }
    }
    return false;
}

しかし、Activity Manager Running Service Info では、実行しているインテント サービスのクラスを取得していないため、これは常に誤りです。

API 呼び出しの応答に Broadcast を使用しました。

私もこのコードをチェックしました。

if(startService(someIntent) != null) { 
 Toast.makeText(getBaseContext(), "Service is already running",     Toast.LENGTH_SHORT).show();
} else {
 Toast.makeText(getBaseContext(), "There is no service running, starting     service..", Toast.LENGTH_SHORT).show();
} 

ただし、このコードでは、サービスをチェックすると、サービスが再度開始されるため、サービスが 2 回呼び出されます。

これで私を助けてください。

4

2 に答える 2

1

あなたのコードでは、アクティビティからサービスのステータスを取得しようとしています。正しい方法は、ステータスがサービスによって与えられるべきであるということです。

アクティビティがサービスと通信したり、その逆の通信を行う可能性はいくつかあります。ブロードキャストレシーバーを使用しているため、サービスの開始時に onHandleIntent() メソッドでメッセージをブロードキャストできます。

タスクが完了したとき、またはエラーが発生した場合は、サービス終了イベントのブロードキャストレシーバーを再度呼び出すことができます。

ここに素敵なチュートリアルへのリンクがあります。

于 2015-02-03T12:45:31.187 に答える