简体   繁体   English

从库开始结果的活动

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM