0
我有一個應用程序A使用以下代碼調用另一個應用程序B的Activity。如何將結果返回到調用活動
int request_code = 4;
Intent i = new Intent();
i.setClassName("name.of,packageB","class.name.of.packageB");
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityForResult(i, request_code);
應用程序B中的目標活動已啓動,此目標活動產生了另一項服務。
一旦此服務完成,我需要將結果返回給調用活動。
有什麼方法比調用sendBroadcast(Intent)
我有一個不能正常工作下面的代碼來做到這一點其他的。任何對此的幫助表示讚賞。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_activity_main);
String finish_activity="";
try{
Intent intent = getIntent();
if(intent!=null && intent.getExtras()!=null)
finish_activity = intent.getExtras().getString("finish_activity", "");
}catch(Exception e){
System.out.println(e.toString());
}
if(finish_activity.equals("")){
Intent intent = new Intent(this, Service.class);
intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
startService(intent);
} else{
ActivityManager am = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
Intent i = new Intent();
setResult(RESULT_OK,i);
finish();
}
}
我再次通過該服務調用此Activity以返回不起作用的結果。 服務代碼調用我的目標活動。
Intent intent_finish = new Intent(context, TargetActivityName.class);
intent_finish.putExtra("finish_activity", "true");
intent_finish.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent_finish.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
intent_finish.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent_finish);
我沒有在我的應用程序A中收到startActivityForResult的任何回調。任何幫助都非常感謝。
我的兩個應用程序的完整代碼。 應用程序A
public class AppA extends Activity {
private Button mOnBootBtn;
private Button mSettingsBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if((requestCode == 4)&& (resultCode==RESULT_OK)){
System.out.println("result code = "+requestCode);
}
};
public void simulate(View view){
if(view.getId() == R.id.invoke){
int request_code = 4;
Intent i = new Intent();
i.setClassName("com.example.AppB","com.example.AppB.Test");
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityForResult(i, request_code);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
應用B - Test.java
public class Test extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_activity_main);
String finish_activity="";
try{
Intent intent = getIntent();
if(intent!=null && intent.getExtras()!=null)
finish_activity = intent.getExtras().getString("finish_activity", "");
}catch(Exception e){
System.out.println(e.toString());
}
if(finish_activity.equals("")){
Intent intent = new Intent(this, Service.class);
intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
startService(intent);
} else{
ActivityManager am = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
Intent i = new Intent();
setResult(RESULT_OK,i);
finish();
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onRestoreInstanceState(savedInstanceState);
}
}
應用B- Service.java
public class Service extends Service {
public static Context context;
public static Intent receivedIntent;
public static String calling_intent;
@Override
public void onStart(Intent intent1, int startId) {
// TODO Auto-generated method stub
super.onStart(intent1, startId);
System.out.println("Inside Service");
if (NetworkAvailable(context)) {
Intent intent_finish = new Intent(context, Test.class);
intent_finish.putExtra("finish_activity", "true");
intent_finish.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent_finish.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
intent_finish.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent_finish);
}
}else{
System.out.println("Inside service - No net");
}
}
@Override
public IBinder onBind(Intent receivedIntent) {
// TODO Auto-generated method stub
return null;
}
private static boolean NetworkAvailable(Context context) {
ConnectivityManager connectivityManager;
try{
connectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}catch(Exception e){
System.out.println(e.toString());
return false;
}
}
}
在此先感謝。
您需要重寫調用活動的方法:onActivityResult()。更多可以在這裏找到(http://developer.android.com/training/basics/intents/result.html「活動結果的Android文檔」) – Stunna
@Stunna:我在我的應用程序A中有onActivityResult()我沒有收到回覆。當我在Target應用程序完成後調試應用程序時,我期望將控制權轉移到應用程序A,但應用程序A無法控制回來。我認爲正在調用目標活動的服務正在接聽電話。我的疑問是如何將這個結果返回到最初稱爲應用程序A –
對不起,但由於我沒有看到你的代碼,我只想確保你還包含@Override在onActivityResult的實現之上?任何方式發佈你的方法實施? – Stunna