1

私は Android を初めて使用し、構想の問題で立ち往生しています。いくつかのアクティビティを含むアプリケーションがあります。これらのアクティビティの一部は重要であり、ユーザーが webApp にログインする必要があります。

ユーザーがボタンをクリックしてこれらの重要なアクティビティの 1 つに到達すると、バックグラウンド サービスを呼び出して、ユーザーがまだ webApp に接続しているかどうか (タイムアウトではない) を尋ねます。ユーザーがログインしている場合、アクティビティが開始されます。それ以外の場合は、ダイアログがポップアップしてユーザー名とパスワードを要求します。問題は、保護されたアクティビティがいくつかあることです。同じサービスを使用して検証を行いたいと考えています。今のところはうまくいきますが、ちょっとぎこちないです。

    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);       
            }
        });
    }
}

そして私のサービス

    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;
     }
 }

私の少しの知識では、インテントを送信できたらいいのにと思いますが、UI スレッドではないため、それは不可能のようです。

私の質問は、このサービスをより汎用的にするにはどうすればよいですか?

4

1 に答える 1

1

検証を行うために同じサービスを使用したい。

サービスを破棄しない場合、同じサービス オブジェクトになります。サービスを開始したアクティビティがサービスを終了または停止した場合、それがサービスを開始した一意のアクティビティである場合は破棄される可能性があります。サービスがバックグラウンドで思い出させるようにしたい場合は、アプリケーションクラス(アプリケーションを拡張)および必要な各アクティビティでサービスを開始します。アクティビティがサービスを停止または終了しても、アプリケーション クラスはまだ接続されているため、サービスは破棄されません。

編集:

putExtra を何度も書くのを避けるには:

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");
     }
}

開始するには:

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");
     }
}

また、アクティビティ名、クラス名など、必要なものを渡して、各アクティビティの toString メソッドをオーバーライドできます。次に、インテントを開始すると:

this.startService(new StartOrder2(this));

または、このユーティリティを使用して Activity を拡張します。

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");
[...]
于 2012-06-29T07:05:00.040 に答える