2013-03-13 4 views
0

이것은 더 의문의 여지가 있습니다. 현재, 내 코드는 잘 작동하지만 올바른 방법으로하고 있는지 확인하고 싶습니다.동일한 패키지의 서비스에서 활동이 실행되고 있는지 확인하십시오.

나는 액티비티가 포 그라운드에서 실행 중인지 확인하는 서비스가 있습니다. 그럴 경우, 활동에 브로드 캐스트를 보냄으로써 활동이 화면의 일부 내용을 갱신합니다. 서비스 활동이 전경에 있는지 알 필요가 여기에

com.harkdev.ServerStatus.SERVER_UPDATED 

, 그래서 그것은 ApplicationManager에서 실행중인 작업을 읽는 IsActivityRunning() 방법을 사용

나는 서비스에 IntentFilter를 만들었습니다. 즉, GET_TASKS 권한을 설정해야합니다.

SERVICE와 ACTIVITY가 동일한 패키지에 있으므로이 정보를 얻는 더 좋은 방법은 무엇입니까 ?? 그리고 아마도 시도하고 피하기 GET_TASKS 설정을 피하기 ??

내 서비스 코드입니다 :

if (IsActivityRunning()) { 
    Intent localIntent = new Intent(SERVER_UPDATED); 
    SendBroadcast(localIntent, null); 
} 

IsActivityRunning() 방법 :

public bool IsActivityRunning() { 
    ActivityManager manager = (ActivityManager) GetSystemService(ActivityService); 
    IList<ActivityManager.RunningTaskInfo> runningTaskInfo = manager.GetRunningTasks(1); 

    ComponentName componentInfo = runningTaskInfo[0].TopActivity; 
    if (componentInfo.PackageName == "com.harkdev.ServerStatus") 
     return true; 

    return false; 
} 

그리고 이것은 내 활동 코드입니다 :

protected override void OnCreate (Bundle bundle) { 
    base.OnCreate(bundle); 
    // Set our view from the "main" layout resource 
    SetContentView (Resource.Layout.Main); 

    IntentFilter filter = new IntentFilter(ServerStatusCheckService.SERVER_UPDATED); 
    _receiver = new ServiceBroadcastReceiver(); 
    _receiver.Received += Receiver_Received; 

    RegisterReceiver(_receiver, filter); 
} 

답변

3

먼저가있어 문자열을 비교하는 잘못된 방법 :

if (componentInfo.PackageName == "com.harkdev.ServerStatus") 
그것은해야한다 :

if ("com.harkdev.ServerStatus".equals(componentInfo.PackageName)) 

둘째, 서비스 및 활동 앱에있는 경우 다음 내가 요구 사항은 "동일한 패키지"를 확인하기 위해 생각 필요가 없습니다. ,

  • 활동에서 서비스를 시작, 당신이 ResultReceiver을 만들 의도에 넣어 :

    이 활동에 서비스 정보를 보내려면 (3+ API에서 사용 가능) ResultReceiver 사용할 수 있습니다 서비스를 시작합니다.
  • 서비스에서 ResultReceiver의 압축을 풉니 다. 정보를 보내려는 경우 send()을 사용하십시오.
  • 활동에서 onDestroy()과 같이 ResultReceiver이 유효하지 않으며 제거해야한다는 명령을 서비스에 알릴 수 있습니다.

는 Edied는 예를 들어

:

는 활동에
  • 는 :

    // Global variable. 
    private ResultReceiver mResultReceiver = new ResultReceiver() { 
    
        @Override 
        protected void onReceiveResult(int resultCode, Bundle resultData) { 
         // Update the UI here... 
        } 
    } 
    

    당신은 서비스를 시작할 때 :

    Intent i = new Intent(this, TheService.class); 
    // You can use different action names for different commands. 
    i.setAction("REGISTER_RECEIVER"); 
    i.putExtra("ResultReceiver", mResultReceiver); 
    i.putExtra("ResultReceiver_ID", hashCode()); 
    startService(i); 
    

    그리고 onDestroy()에서3210 :

    Intent i = new Intent(this, TheService.class); 
    i.setAction("UNREGISTER_RECEIVER"); 
    i.putExtra("ResultReceiver_ID", hashCode()); 
    startService(i); 
    
  • 서비스에서 :

    내가 알람 관리기에 의해 실행되는 서비스를 프로그램하면 어떻게
    import android.util.SparseArray; 
    
    // ... 
    
    private SparseArray<ResultReceiver> mReceiverMap = new SparseArray<ResultReceiver>(); 
    
    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
        if ("REGISTER_RECEIVER".equals(intent.getAction())) { 
         // Extract the ResultReceiver and store it into the map 
         ResultReceiver receiver = intent.getParcelableExtra("ResultReceiver"); 
         int id = intent.getIntExtra("ResultReceiver_ID", 0); 
         mReceiverMap.put(id, receiver); 
        } else if ("UNREGISTER_RECEIVER".equals(intent.getAction())) { 
         // Extract the ResultReceiver ID and remove it from the map 
         int id = intent.getIntExtra("ResultReceiver_ID", 0); 
         mReceiverMap.remove(id); 
        } 
    
        // ... 
    } 
    
+0

? ResultReceiver는 어떻게 처리합니까? –

+0

@JuanuHaedo 서비스에 'ResultReceiver'가 등록되어 있지 않으면 실행중인 작업이 없습니다. 그래서 당신은 확인할 필요가 없습니다. –

+0

아마도 내 앱이 어떻게 작동하는지 더 자세히 설명해야합니다. 첫 번째로, 내 활동이 일정을 만듭니다. 둘째 :이 일정은 AlarmManager에 의해 서비스에서 실행됩니다. 서비스가 실행되고 활동이 실행 중이면 활동 화면의 정보를 업데이트해야합니다. 그렇지 않으면 아무 것도하지 않아도됩니다. –

관련 문제