【问题标题】:error at onHandleIntent cannot get receiveronHandleIntent 的错误无法获取接收者
【发布时间】:2018-01-16 15:31:42
【问题描述】:

我需要调用 onHandleIntent 并从 app1 接收一个值并在 app2 中获得结果,而无需用户通知(不同的应用程序,一个活动将调用另一个应用程序的服务)。 但是,当 onHandleIntent 在这一行开始时:

 mReceiver = workIntent.getParcelableExtra("receiver");

带来错误

E/Parcel: Class not found when unmarshalling: com.example.idscomercial.myapplication.AddressResultReceiver
          java.lang.ClassNotFoundException: com.example.idscomercial.myapplication.AddressResultReceiver
             ...
           Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.idscomercial.myapplication.AddressResultReceiver" on path: DexPathList[[zip file "/data/app/com.veritran.vttokentest-2/base.apk"],nativeLibraryDirectories=[/data/app/com.veritran.vttokentest-2/lib/arm, /vendor/lib, /system/lib]]

我真的读过:

https://stackoverflow.com/questions/28589509/android-e-parcel-class-not-found-when-unmarshalling-only-on-samsung-tab3

但还是找不到解决办法

这是代码:

应用程序1

public class servicev extends IntentService {

    protected ResultReceiver mReceiver;

    public servicev() {
        super("yeah");
    }

    @Override
    protected void onHandleIntent(Intent workIntent) {
        Toast b = Toast.makeText(this.getApplicationContext(), "onHandle starting",  Toast.LENGTH_LONG    );
        b.show();
        Log.d("just", "tellme");
        String dataString = workIntent.getDataString();
        mReceiver = workIntent.getParcelableExtra("receiver");
       // mReceiver = new AddressResultReceiver(new Handler());

        deliverResultToReceiver(1,"value of servicev");
    }

    private void deliverResultToReceiver(int resultCode, String message) {
        Bundle bundle = new Bundle();
        bundle.putString("receiver", message);
        mReceiver.send(resultCode, bundle);
    }



}

应用程序2:

public class MainActivity extends AppCompatActivity {

    protected ResultReceiver mResultReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        startIntentService();
        setContentView(R.layout.activity_main);
    }

    protected void startIntentService() {
        //Intent intent = new Intent();
        mResultReceiver = new AddressResultReceiver(new Handler());
        Intent intent=new Intent("com.veritran.vttokentest.servicev.START_SERVICE");


        intent.setPackage("com.veritran.vttokentest");
        //Intent intent = new Intent(this, FetchAddressIntentService.class);
        intent.putExtra("receiver", mResultReceiver);
        startService(intent);
    }




}

==> 2

public
class AddressResultReceiver extends ResultReceiver {

    public AddressResultReceiver(Handler handler) {
        super(handler);
    }

    @Override
    protected void onReceiveResult(int resultCode, Bundle resultData) {

        int duration = Toast.LENGTH_LONG;
        String mAddressOutput = resultData.getString("1");
        //Toast toast = Toast.makeText(context, "hi brow", duration);
        //toast.show();
        if (resultCode == 1) {



        }

    }
}

清单 app1:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.veritran.vttokentest">

    <application
        android:allowBackup="false"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name="com.veritran.vttokentest.MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <service
            android:enabled="true"
            android:exported="true"
            android:name="com.veritran.vttokentest.servicev">
            <intent-filter>
            <action android:name="com.veritran.vttokentest.servicev.START_SERVICE" />
            </intent-filter>
            </service>


    </application>

</manifest>

【问题讨论】:

    标签: android android-intent service


    【解决方案1】:

    这里可能会发生一些事情。首先,您将需要一个接收器来将信息从您的服务返回到主要活动。要创建接收器,请创建一个如下所示的新类:

    public class myReceiver extends ResultReceiver {
    private Receiver mReceiver;
    
    public myReceiver(Handler handler) {
        super(handler);
    }
    
    public void setReceiver(Receiver receiver) {
        mReceiver = receiver;
    }
    
    public interface Receiver {
        void onReceiveResult(int resultCode, Bundle resultData);
    }
    
    @Override
    protected void onReceiveResult(int resultCode, Bundle resultData) {
        if (mReceiver != null) {
            mReceiver.onReceiveResult(resultCode, resultData);
        }
    }
    

    然后,在您的主要活动中,使用以下代码创建接收器 onCreate():

    mReceiver = new myReceiver(new Handler());
    mReceiver.setReceiver(this);
    

    这对于实际获取任何数据是必要的。您还需要在定义意图的部分将接收者作为额外的intent.putExtra("receiver", mReceiver); 传递到意图中。然后,在 IntentService 中,您可以使用 workIntent.getParcelableExtra("receiver").send(1, b) 将您的信息发送回 MainActivity(其中 1 是您想要的结果代码,b 是您想要发回的所有信息的 Bundle)。

    至于为什么你的服务永远不会被调用,我会检查here 看看你是否真的向服务发送了正确的意图。您还应该尝试从您的服务中删除意图过滤器,因为它是不必要的。

    一般来说,您不会想在服务中创建一个新的 MainActivity 而是使用接收器。否则你的服务似乎是正确的,所以我会确保你检查你试图传递的意图。如果仍然失败,这里有许多其他线程关于这个问题。

    我是新来的,所以如果您需要更多帮助,请告诉我。

    【讨论】:

    • 我会全天听从你的建议,并在这里发布结果
    • 这是到目前为止的代码......仍然没有进入onHandleIntent......随意更改它collabedit.com/96uem
    • 嗯,你怎么知道它没有达到句柄意图?
    • Ahhhh 我会尝试运行调试器或放入日志语句,因为 toast 不是一种可靠的调试方法。 Toasts 必须在主 UI 线程中创建,如果您在服务中创建它们,则不会显示。
    • 是的,我也在调试器中运行应用程序,并在 onHandleIntent 第一行设置了断点,打开 app2 并没有启动,想法?
    猜你喜欢
    • 2019-04-18
    • 2021-08-10
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2014-08-13
    • 2018-05-15
    • 2020-01-20
    • 2018-05-14
    相关资源
    最近更新 更多