簡體   English   中英

從服務調用活動傳遞字符串數據

[英]Calling an activity from Service passing String data

我想從Android中的服務調用活動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); 

首先創建一個界面

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

現在,在您的Service類的onStart()方法中,在調用活動之前編寫此行

ActA.setMyListener(this);

這樣就完成了,當從活動B調用到A的onActivityResult時,從A到Serivce可以監聽doActions()的重寫方法

在您要執行的服務的doActions()方法中編寫所有代碼

這是代碼

第一個活動: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;
}
}

第二活動: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();
}

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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM