1

Android の Service から Activity A を呼び出したい (それにいくつかの文字列を渡したい)。このアクティビティ A は、startActivityForResult().基本的に、アクティビティ B からの結果が得られるまでサービスを待機させたい別のアクティビティ B を呼び出します。この実装をどのように行うことができるか (およびどのフラグを意図的に設定するか) を教えてください。

サービス:

Intent intent = new Intent(getBaseContext(),ActivityA.class);       
intent.putExtra("code",script);
intent.putExtra("type", type);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

アクティビティA :

Intent intent = new Intent(this,ActivityB.class);
intent.putExtra("code",code);
intent.putExtra("type", type);      
startActivityForResult(intent,REQUEST_CODE); 
4

1 に答える 1

0

最初にインターフェイスを作成します

public interface MyActions {
public void doActions();
}

次に、サービス クラスにそのインターフェイスを実装させます

public class MyService extends Service implements MyActions{

メソッドをオーバーライドします

@Override
public void doActions() {
    //Some code
}

アクティビティ A が startActivityForResult メソッドを介して B を呼び出しているため、A の onActivityResult をオーバーライドします。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    //Some code
}

この A クラスで、インターフェイスの静的インスタンスを作成します

static MyActions mActions;

そして今、このような静的メソッドを書きます

public static void setMyListener(MyActions act){
    mActions = act;
}

クラス A 用にオーバーライドした onActivityResult に、次のコード行を追加します。

mActions.doActions();

だからあなたは得る

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    mActions.doActions();
}

onStart() メソッドの Service クラスで、アクティビティを呼び出す前にこの行を記述します。

ActA.setMyListener(this);

アクティビティ B から呼び出しが A の onActivityResult に行き、A からサービスが doActions() のオーバーライドされたメソッドをリッスンできる場合、これで完了です。

実行したいサービスの doActions() メソッドにすべてのコードを記述します

ここにコードがあります

1 番目のアクティビティ: ActA.java

public class ActA extends Activity {
static MyActions mActions;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.act1);
    Button btn = (Button) findViewById(R.id.button1);
    btn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            startActivityForResult(new Intent(ActA.this,ActB.class), 15);
        }
    });
}


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Log.d("Response","requestCode" + requestCode + " resultCode" + resultCode);
    mActions.doActions();
}

public static void setMyListener(MyActions act){
    mActions = act;
}
}

2 番目のアクティビティ: ActB.java

public class ActB extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.act2);
}
}

アプリ起動時の MainActivity

public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //Start the service
    startService(new Intent(this, MyService.class));
}
}

インターフェース: MyActions.java

public interface MyActions {
public void doActions();
}

Service クラス: MyService.java

public class MyService extends Service implements MyActions{


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

public void onStart(Intent intent, int startId) {

    super.onStart(intent, startId);
    Log.d("Response", "Started");
    ActA.setMyListener(this);
    startActivity(new Intent(this,ActA.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
}

@Override
public void doActions() {
    Log.d("Response", "Listener working");
}

}
于 2012-10-25T11:17:15.937 に答える