2012-06-29 5 views
1

저는 Android를 처음 사용하고 있습니다. 개념 상 문제가 있습니다. 몇 가지 활동이있는 응용 프로그램이 있는데, 그 중 일부는 중요하며 사용자가 웹 응용 프로그램에 로그인해야합니다.하나의 백그라운드 서비스로 다른 활동을 시작하는 방법

사용자가 중요한 활동 중 하나에 도달하기 위해 버튼을 클릭 할 때 사용자가 여전히 웹 응용 프로그램에 연결되어 있는지 묻는 백그라운드 서비스를 호출합니다 (시간 초과 아님). 사용자가 로그인하면 활동이 시작되고, 그렇지 않으면 대화 상자가 나타나 사용자 이름과 암호를 묻습니다. 문제는 몇 가지 보호 된 활동이 있으며 동일한 서비스를 사용하여 확인 작업을 수행하려고합니다. 내가 지금하는 방식은 작동하지만 그것은 일종의 응석입니다. 내 작은 지식

public class ConnexionManagerService extends Service{ 
    public class IsConnectedAsync extends AsyncTask<String , Void, Void>{ 
     protected Void doInBackground(String... whoIsCalled) { 
      String redirectedURL = getRedirectedURL(); 
      if(redirectedURL.equalsIgnoreCase(IF_NOT_CONNECTED_URL)){ 
       if(whoIsCalled[0].equalsIgnoreCase("FIRST_ACTIVITY")){ 
        Intent trueIntent = new Intent(getBaseContext(), FirstActivity.class); 
        trueIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
        getApplication().startActivity(trueIntent); 
       } 
       else if(whoIsCalled[0].equalsIgnoreCase("SECOND_ACTIVITY")){ 
        Intent trueIntent = new Intent(getBaseContext(), SecondActivity.class); 
        trueIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
        getApplication().startActivity(trueIntent); 
       }  
      } 
      else{ 
       Intent falseIntent = new Intent(getBaseContext(), PopUpLoginActivity.class); 
       falseIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       getApplication().startActivity(falseIntent); 
      } 
     } 
     return null; 
    } 
    } 

    @Override 
    public void onCreate() { 
    Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show(); 
    Log.d("service onCreate", "onCreate"); 
    } 

    public int onStartCommand(Intent intent, int flags, int startId){ 
    String whoIsCalled = intent.getStringExtra("WHO_IS_CALLED"); 
    new IsConnectedAsync().execute(whoIsCalled);   
    return START_STICKY; 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
    return null; 
    } 
} 

public class A_Activity extends Activity { 
    Context context; 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     context = getApplicationContext(); 
     setButtonClickListener(); 
    } 

    private void setButtonClickListener() { 

     button_1 = (Button)findViewById(R.id.button1); 
     button_1.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) {  
       Intent intentCall = new Intent(context,com.them.cp.ConnexionManagerService.class); 
       intentCall.putExtra("WHO_IS_CALLED","FIRST_ACTIVITY"); 
       context.startService(intentCall);     
      } 
     }); 

     button_2 = (Button)findViewById(R.id.button2); 
     button_2.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       Intent intentCall = new Intent(context,com.them.cp.ConnexionManagerService.class); 
       intentCall.putExtra("WHO_IS_CALLED","SECOND_ACTIVITY"); 
       context.startService(intentCall);  
      } 
     }); 
    } 
} 

그리고 내 서비스 난 그냥 의도를 보낼 수 좋겠지 만, UI 스레드 아니다으로 가능하지 보인다.

내 질문은 :이 서비스를보다 일반적인 것으로 만들려면 어떻게해야합니까?

답변

1

동일한 서비스를 사용하여 확인하고 싶습니다.

서비스를 삭제하지 않으면 서비스 개체가 동일합니다. 서비스를 시작한 활동이 서비스를 종료하거나 중지하면 서비스를 시작한 고유 한 활동 인 경우 서비스가 파괴 될 수 있습니다. 서비스가 백그라운드에서 시작할 때 응용 프로그램 클래스 (응용 프로그램 확장)와 필요한 각 활동에서 다시 시작하도록 상기시키는 것이 좋습니다. 활동이 서비스를 중지하거나 종료하면 응용 프로그램 클래스가 계속 연결되어있어 서비스가 파기되지 않습니다.

편집 :

하는 putExtra 또 다시 쓰기를 방지하려면 :

this.startService(new StartOrder1(this, "My activity name")); 

가장 좋은 해결책 :

public class StartOrder2 extends Intent { 

    public StartOrder(Activity a){ 
      super(a, ServiceName.class); 
      super.putExtra("WHO", a.toString()); 
    } 

    public String getWho(){ 
      reurn.getIntExtra("WHO"); 
    } 
} 

을 그리고 당신은 할 수

public class StartOrder1 extends Intent { 

    public StartOrder(Context ctx, String activity_name){ 
      super(ctx, ServiceName.class); 
      if(activity_name != null) 
       super.putExtra("WHO", activity_name); 
      else 
       super.putExtra("WHO", "UNKNOWN"); 
    } 

    public String getWho(){ 
      reurn.getIntExtra("WHO"); 
    } 
} 

그것을 시작하려면 toString를 오버라이드 (override)합니다 활동 이름, 클래스 이름, 원하는대로 각 활동의 hod. 그런 다음 당신이 의도 시작할 때 :

this.startService(new StartOrder2(this)); 

을 또는이 유틸리티로 활동을 확장 :

public class EnhancedActivity extends Activity{ 

    protected startMyService(String name){ 
      Intent i = new Intent(this, MyService.class); 
      i.putExtra("who", name); 
      startService(i); 
    } 
} 

그리고

[...] 
super.startMyService("activity_name"); 
[...] 
+0

이 답변 주셔서 감사합니다 최종 활동에 전화를, 내가 알고 동일한 서비스 객체가 될 것입니다. 내 질문을 명확하게하겠습니다. WHO_IS_CALLED with intent를 전달하지 않고도 사용할 수 있도록 매개 변수를 전달할 수 있도록 코드를 개선하는 방법을 알고 싶습니다. –

+0

...이 정보를 추가하고 싶지 않으면 관례를 작성하십시오. –

+0

답장을 보내 주셔서 감사합니다.그러나 마침내 필자가 조각을 사용하여 수행하고있는 작업을 단순화하는 방법을 찾았습니다. 이로 인해 내 액티비티 아키텍처가보다 효율적으로 작동하게되었습니다. –

관련 문제