[英]Start activity for result from library
I want to call an activity for result from an class that is refrenced from library . 我想为来自library引用的类的结果调用一个活动。 I have main project say p1 and another project say p2 which is added as library to p1, and inside p2 I have class : MiddleWareStart and from it I want to call an activity that belongs to p2 : DeviceListActivity I have tried to use startActivityForResult from MiddleWareStart but it dosn't work and cause runtime error ,and so I tried to put the main activity from p1 when refrencing MiddleWareStart as: 我有一个主项目说p1,另一个项目说p2作为库添加到p1,在p2内部我有一个类:MiddleWareStart,从中我想调用一个属于p2的活动:DeviceListActivity我试图从MiddleWareStart使用startActivityForResult但是它不起作用并导致运行时错误,因此在尝试对MiddleWareStart进行以下操作时,我尝试将p1的主要活动设置为:
MiddleWareStart x=new MiddleWareStart(mainActivity.this);
and inside MiddleWareStart I put Activity a, and in the constructor: 在MiddleWareStart内部,我将Activity a放置在构造函数中:
public MiddleWareStart(Activity activity)
{
this.a=activity;
Intent intent=new Intent(a,DeviceListActivity.class);
a.startActivityForResult(intent,1);
} }
Now it works and the activity DeviceListActivity.java is started , but the problem that on Activity Result that is implemented inside the MiddleWareStart is never called. 现在它可以正常工作,并且启动了DeviceListActivity.java活动,但是从未调用过在MiddleWareStart内部实现的Activity Result上的问题。 and i have declared the set Resullt inside the called activity (DeviceListActivity) . 我已经在调用的活动(DeviceListActivity)中声明了集合Resullt。 And when I try to launch p2 itself (not p1) every think work correctly as expected and on Activity Result is called here the needed code: 当我尝试启动p2本身(而不是p1)时,每个想法都可以按预期正确运行,并且在Activity Result上需要以下代码:
Inside mainActivity (GameActivity) inside p1 在p1内部的mainActivity(GameActivity)中
MiddleWareStart x=new (GameActivity.this);
Inside MiddleWareStart (inside p2) 在MiddleWareStart内部(在p2内部)
public class MiddleWareStart extends Activity
{
Activity a;
public MiddleWareStart(Activity activity)
{
this.a=activity;
Intent intent=new Intent(a,DeviceListActivity.class);
a.startActivityForResult(intent,1);
Toast.makeText(this,"Check toast",5).show();
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case 1:
Toast.makeText(this,"inside on activity result",5).show();
if (resultCode == Activity.RESULT_OK) {
Toast.makeText(this,"ok",5).show();
}
break;
case2:----
}
}
}
The output only show Check toast 输出仅显示Check toast
Also I tried to put onActivityResult inside main.java but also it hasn't been called 我也尝试将onActivityResult放在main.java中,但是它还没有被调用
Inside DeviceListActivity: 在DeviceListActivity内部:
Intent intent = new Intent();
intent.putExtra(EXTRA_DEVICE_ADDRESS, address);
// Set result and finish this Activity
setResult(Activity.RESULT_OK, intent);
And here my manifest file for the main project: 这是我的主项目清单文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.tictactoe.library"
android:versionCode="1"
android:versionName="1.0"
android:name="com.example.GlobalState">
<uses-sdk android:minSdkVersion="8" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS"></uses-permission>
<application android:icon="@drawable/icon" android:label="@string/tie"
android:name="com.example.GlobalState">
<activity android:name=".GameActivity"
android:label="@string/tie">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.example.DeviceListActivity"
android:label="@string/select_device"
android:configChanges="orientation|keyboardHidden" >
</activity>
<activity android:name="com.example.MiddleWareStart"
android:label="@string/select_device"
android:configChanges="orientation|keyboardHidden" >
</activity>
</application>
And here the manifest for the library project: 这是库项目的清单:
android:versionCode="1"
android:versionName="1.0">
<uses-sdk minSdkVersion="6" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.WRITE_GSERVICES"></uses-permission>
<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS"></uses-permission>
<application android:label="@string/app_name"
>
<activity android:name=".MiddleWareStart"
android:label="@string/app_name"
android:configChanges="orientation|keyboardHidden">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".com.example.DeviceListActivity"
android:label="@string/select_device"
android:configChanges="orientation|keyboardHidden" />
</application>
Thank you for reading any suggestion will be usefull 感谢您阅读任何建议将是有益的
Be careful, storing a reference to an Activity in a variable can lead to unexpected problems, because Android can destroy the activity whenever it wants (to free memory). 请注意,在变量中存储对Activity的引用可能会导致意外问题,因为Android会在需要时销毁该活动(释放内存)。
Instead, you can call startActivityForResult() directly from your second activity, get the result, then use broadcast receivers to notify your first activity. 相反,您可以直接从第二个活动中调用startActivityForResult(),获取结果,然后使用广播接收器通知您的第一个活动。
MiddleWareStart extends Activity but you don't start it as an activity so it's not in the "activity stack" and cannot act as the calling activity. MiddleWareStart扩展了Activity,但您没有将其作为活动启动,因此它不在“活动堆栈”中,并且不能充当调用活动。 Hence the exception. 因此,例外。 If you call a.StartActivityForResult - a is the calling activity and therefore a's onActivityResult will be invoked. 如果您调用a.StartActivityForResult-a是调用活动,因此将调用a的onActivityResult。 Hope that helps. 希望能有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.