首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bindService上的NullPointerException getPackageName()

bindService上的NullPointerException getPackageName()
EN

Stack Overflow用户
提问于 2019-09-16 00:30:27
回答 1查看 85关注 0票数 1

我正在尝试为android应用程序创建远程服务。我或多或少地从Android开发人员网站上复制了代码,并根据我的目的对其进行了重新组合。但是,当我到了bindService步骤时,我在android.content.Context.getPackageName()上得到了一个NullPointerException。我做错了什么?

我在较早版本的应用程序中使用了进程内服务,但这还不足以满足我的需求。除了必要的代码更改之外,服务本身在两者之间保持不变。我已经看过这里的所有结果,但它们要么是无关的,要么对我没有任何帮助。

我已经尝试将呼叫从onCreate转移到onStart。没什么区别。从未执行过BinderActivity的onCreate。我尝试了startService而不是bindService,但它给了我相同的错误。我已经检查了this、intent和mConnection都是非空的(它们都是)。我知道服务没有启动,但我使用的是Context.BIND_AUTO_CREATE (如果它没有启动,它应该会启动它)。除了在这个问题上摆弄一个死鸡,我不知道还能做什么。

我的MainActivity:

代码语言:javascript
复制
package com.example.trainchecker;

import android.content.Intent;
import android.os.Bundle;

import com.google.android.material.floatingactionbutton.FloatingActionButton;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.Context;


import android.os.Message;
import android.os.Messenger;

import java.io.*;
import java.util.ArrayList;


import android.widget.TextView;


public class MainActivity extends AppCompatActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        BinderActivity ba = new BinderActivity();
        ba.BindService();
    }
}

这就是BinderActivity,魔术应该在这里发生。相反,该错误会:

代码语言:javascript
复制
package com.example.trainchecker;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import android.os.Message;
import android.os.Handler;
import android.os.Messenger;



public class BinderActivity extends Activity {
    public Messenger ms = null;
    private MainActivity ma;

    class IncomingHandler extends Handler{
        @Override
        public void handleMessage(Message msg){
                super.handleMessage(msg);
        }
    }

    final Messenger mm = new Messenger(new IncomingHandler());

    private ServiceConnection mConnection = new ServiceConnection() {
        public void onServiceConnected(ComponentName className, IBinder service) {
            Log.d("MCon","Sentinel Online");
            ms = new Messenger(service);
            try {
                Message msg = Message.obtain(null,TCService.MSG_REGISTER_CLIENT);
                msg.replyTo = mm;
                ms.send(msg);
            } catch (RemoteException e){   e.printStackTrace();}
        }
        public void onServiceDisconnected(ComponentName className) {
            Log.d("MCon","Sentinel Offline");
            try {
                Message msg = Message.obtain(null,2);
                msg.replyTo = mm;
                ms.send(msg);
            } catch (RemoteException e){   e.printStackTrace();}
        }
    };



    public void BindService() {
        bindService(new Intent(this, TCService.class), mConnection, Context.BIND_AUTO_CREATE);
    }


}

最后,是服务本身。不是很多,但是是我的:

代码语言:javascript
复制
package com.example.trainchecker;

import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.Service;

import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;

import java.util.ArrayList;
import android.os.Message;
import android.os.Messenger;

public class TCService extends Service {

    ArrayList<Messenger> mc = new ArrayList<>();

    @Override
    public IBinder onBind(Intent i) {
        Log.d("TCS", "Binding Now");
        return mm.getBinder();
    }


    static final int MSG_REGISTER_CLIENT = 1;

    class IncomingHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 1:
                    mc.add(msg.replyTo);
                    break;
                case 2:
                    mc.remove(msg.replyTo);
                    break;
                default:
                    super.handleMessage(msg);
            }
        }
    }

    final Messenger mm = new Messenger(new IncomingHandler());
}

下面是完整的错误:

代码语言:javascript
复制
09-15 11:39:04.518 15448-15448/com.example.trainchecker E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.trainchecker, PID: 15448
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.trainchecker/com.example.trainchecker.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
        at android.app.ActivityThread.access$900(ActivityThread.java:150)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:171)
        at android.app.ActivityThread.main(ActivityThread.java:5417)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
        at android.content.ContextWrapper.getPackageName(ContextWrapper.java:133)
        at android.content.ComponentName.<init>(ComponentName.java:128)
        at android.content.Intent.<init>(Intent.java:4468)
        at com.example.trainchecker.BinderActivity.BindService(BinderActivity.java:58)
        at com.example.trainchecker.MainActivity.onCreate(MainActivity.java:65)
        at android.app.Activity.performCreate(Activity.java:6285)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
        at android.app.ActivityThread.access$900(ActivityThread.java:150) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:171) 
        at android.app.ActivityThread.main(ActivityThread.java:5417) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-16 00:36:11

以编程方式实例化Activity实例不会触发生命周期,因此您的上下文在那里是无效的。将其传递给BindService()调用。从技术上讲,您的BinderActivity不需要存在,可以存在于您的MainAcitivity或服务中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57946081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档