use*_*373 13 android android-activity
是否可以startActivityForResult()从非活动类调用以获得结果?
场景是这样的:
我有一个类NonActivity(它不是从Activity派生的,因为它不是UI).这个类将有很多函数(基本上是步骤)来运行.其中一个步骤需要显示UI(Activity)然后获取结果(用户输入内容).然后能够在接下来的步骤中使用该数据.
如果没有派生活动类,如何实现这一点,因为我没有UI组件?此外,因为我不想从活动类派生,这意味着我无法覆盖OnActivityResult().结果究竟来自哪里?
Rag*_*ood 22
startActivityForResult()只能通过真实的屏幕活动获得,因为它是一种方法,以及活动.请重新设计您的应用程序,以便从活动中驱动用户界面.
另一方面,如果您的非Activity类已在屏幕上的Activity中初始化并使用,则可以将该Activity的实例作为构造函数中的参数传递给您的类,并使用它来启动其他活动.
但要小心.使用此方法会增加内存泄漏的风险,因为外部类(在我的示例中为Utils)可能会保留对Activity的引用,即使它已经消失.
如果您只想访问数据,那么您可以尝试将其写入SharedPreferences或数据库或某些文件,然后使用应用程序上下文(通过构造函数再次传入)来读取它.这降低了内存泄漏的风险.就像是:
MyApiClass myApiClass = new MyApiClass(getApplicationContext());
Run Code Online (Sandbox Code Playgroud)
示例代码
主要活动:
public class Main extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Utils util = new Utils(this);
util.startTest();
}
@Override
protected void onActivityResult(int arg0, int arg1, Intent arg2) {
Toast.makeText(this, "onActivityResult called", Toast.LENGTH_LONG).show();
super.onActivityResult(arg0, arg1, arg2);
}
}
Run Code Online (Sandbox Code Playgroud)
Utils类(为结果启动):
public class Utils {
Activity activity;
public Utils(Activity ac) {
activity = ac;
}
public void startTest() {
Intent i = new Intent(activity, Test.class);
activity.startActivityForResult(i, 1);
}
}
Run Code Online (Sandbox Code Playgroud)
测试活动:
public class Test extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Toast.makeText(this, "Test", Toast.LENGTH_LONG).show();
this.setResult(Activity.RESULT_OK);
this.finish();
}
}
Run Code Online (Sandbox Code Playgroud)
使用没有可见GUI的片段的类中的StartActivityForResult.您可能会在实用程序类中找到类似的内容.
请参阅下面的runGetUserAccount.它创建自己的片段并执行startActivityForResult.然后它有自己的onActivityResult.
public class MyGooglePlay {
private static final int CONNECTION_FAILURE_RESOLUTION_REQUEST = 31502;
private ActionBarActivity activity;
private FragmentManager fragManager;
public MyGooglePlay(ActionBarActivity activity) {
this.activity = activity;
this.fragManager = activity.getSupportFragmentManager();
}
/**
* Starts an activity in Google Play Services so the user can pick an
* account
*/
private String mEmail = "";
static final int REQUEST_CODE_PICK_ACCOUNT = 1000;
public void runGetUserAccount() {
if (TextUtils.isEmpty(mEmail)) {
// run this code in gui less fragment so we can pickup the
// on activity result from inside the mygoogleplay class.
Fragment f = new Fragment() {
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
String[] accountTypes = new String[] { "com.google" };
Intent intent = AccountPicker.newChooseAccountIntent(null,
null, accountTypes, false, null, null, null, null);
startActivityForResult(intent, REQUEST_CODE_PICK_ACCOUNT);
}
@Override
public void onActivityResult(int requestCode, int resultCode,
Intent data) {
if (requestCode == REQUEST_CODE_PICK_ACCOUNT) {
if (resultCode == Activity.RESULT_OK) {
set_Email(data
.getStringExtra(AccountManager.KEY_ACCOUNT_NAME));
// getUsername();
}
super.onActivityResult(requestCode, resultCode, data);
}
//this is to verify the fragment has been removed.
//you can log or put a breakpoint to verify
@Override public void onDestroy(){
super.onDestroy();
}
};
FragmentTransaction fragmentTransaction = this.fragManager
.beginTransaction();
fragmentTransaction.add(f, "getusername");
fragmentTransaction.commit();
}
}
/**
* @param mEmail
* the mEmail to set
*/
private void set_Email(String mEmail) {
this.mEmail = mEmail;
if (!TextUtils.isEmpty(mEmail)) {
// TODO notify caller email is ready;
// activity.onEmailReady(mEmail);
}
//we are done with the "getusername" fragment
Fragment f = fragManager.findFragmentByTag("getusername");
if (f!=null) {
fragManager.beginTransaction().remove(f).commit();
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
28071 次 |
| 最近记录: |