7

私は C2DM を使用しています。BroadcastReceivers は C2DM イベントをローカル サービスに伝達します。サービスは、ID を Web サーバー pus に送信して登録を完了します。デバイスに新しいメッセージを通知する責任がありますが、アプリケーション (アクティビティの 1 つ) が起動している場合は、新しいデータを使用してそのアクティビティにインテントを送信したいので、 NotificationManager を使用してユーザーに通知しない場合は、更新できます。

問題は、アクティビティが実行されていることを知る方法です。Service は明らかに存在するアプリケーションの一部であるため、Application オブジェクトはオプションではありません。各アプリケーションの onDesroy での登録解除も、向きの変更で発生する可能性があるためオプションではありません...

それを成し遂げるための標準的な方法はありますか?

4

4 に答える 4

19

解決策 1: ActivityManagerを 使用して、アクティビティが実行中かどうかを確認できます。

public boolean isActivityRunning() { 

ActivityManager activityManager = (ActivityManager)Monitor.this.getSystemService (Context.ACTIVITY_SERVICE); 
    List<RunningTaskInfo> activitys = activityManager.getRunningTasks(Integer.MAX_VALUE); 
    isActivityFound = false; 
    for (int i = 0; i < activitys.size(); i++) { 
        if (activitys.get(i).topActivity.toString().equalsIgnoreCase("ComponentInfo{com.example.testapp/com.example.testapp.Your_Activity_Name}")) {
            isActivityFound = true;
        }
    } 
    return isActivityFound; 
} 

マニフェストに許可を追加する必要があります..

<uses-permission  android:name="android.permission.GET_TASKS"/>

解決策 2: アクティビティで静的変数を使用して、それが実行されているかどうかを確認し、次のようにサービスまたはブロードキャスト レシーバーからアクセスできる場所に保存できます。

static boolean CurrentlyRunning= false;
      public void onStart() {
         CurrentlyRunning= true; //Store status of Activity somewhere like in shared //preference 
      } 
      public void onStop() {
         CurrentlyRunning= false;//Store status of Activity somewhere like in shared //preference 
      }

これがお役に立てば幸いです。

于 2012-05-27T06:50:37.093 に答える
4

次のアプローチは、受信する Google Cloud メッセージ (C2DM) をアクティビティ (実行中の場合) で処理する場合、またはアクティビティが実行されていない場合に通知を発行する場合に適しています。

マニフェスト ファイルに BroadcastReceiver を 1 つ登録します。このレシーバーは、アプリケーションが実行されていないときはいつでも C2D メッセージを処理します。アクティビティに別の BroadcastReceiver をプログラムで登録します。この受信者は、アクティビティが実行されているときはいつでも C2D メッセージを処理します。

AndroidManifest.xml

<receiver
    android:name=".StaticReceiver"
    android:permission="com.google.android.c2dm.permission.SEND" >
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <category android:name="com.mypackage" />
    </intent-filter>
</receiver>

MyReceiver.java

public class StaticReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Trigger a Notification
    }
}

MyActivity.java

public class MyActivity extends ActionBarActivity {

    @Override
    protected void onResume() {
    super.onResume();

        final IntentFilter filter = new 
                IntentFilter("com.google.android.c2dm.intent.RECEIVE");
        filter.addCategory("com.mypackage");
        filter.setPriority(1); 
        registerReceiver(dynamicReceiver, filter, 
                "com.google.android.c2dm.permission.SEND", null);
    }

    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(dynamicReceiver);
    }

    private final BroadcastReceiver dynamicReceiver 
            = new BroadcastReceiver() 
    {
        @Override
        public void onReceive(Context context, Intent intent) {

            // TODO Handle C2DM

            // blocks passing broadcast to StaticReceiver instance
            abortBroadcast();
       }
    };
}

ノート!最初にブロードキャストをキャッチするには、dynamicReceiver IntentFilter の優先度を StaticReceiver インスタンス IntentFilter の優先度よりも高くする必要があります (デフォルトの優先度は「0」です)。

PS。Google Cloud Messaging Service が発行するブロードキャストは、順序付きブロードキャストのようです。原案作者:CommonsWare

于 2014-03-27T12:46:10.683 に答える
0

アクティビティが実行されているかどうかを確認する最も簡単な方法は次のとおりです。

Context context = MyActivity.this; 

if (! ((Activity) context).isFinishing()) {
    //  Activity is running
} else {
    //  Activity has been finished
}

注: アクティビティが実行されていない場合は、UI 関連の操作を実行しないでください。

于 2016-08-22T12:30:38.800 に答える
0

ここからコピペ。

アクティビティ内で静的変数を使用できます。

class MyActivity extends Activity {
     static boolean active = false;

      public void onStart() {
         active = true;
      } 

      public void onStop() {
         active = false;
      }
}
于 2012-05-27T07:40:25.883 に答える