Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在onCreate方法中传递活动上下文_Java_Android_Oncreate - Fatal编程技术网

Java 在onCreate方法中传递活动上下文

Java 在onCreate方法中传递活动上下文,java,android,oncreate,Java,Android,Oncreate,我需要在构建活动后立即将活动上下文传递给我的服务。这是我的密码: public class myService extends Service { private AppCompatActivity activity; public void setActivity(AppCompatActivity activity) { this.activity = activity; } } public class myActivity extend

我需要在构建活动后立即将活动上下文传递给我的服务。这是我的密码:

public class myService extends Service
{
    private AppCompatActivity activity;

    public void setActivity(AppCompatActivity activity)
    {
        this.activity = activity;
    }
}

public class myActivity extends AppCompatActivity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        // ... some things are being executed and myService is being bound
        mService.setActivity(this);
    }
}
我得到的NullPointerException是——我想——myActivity类仍在构造中,无法传递引用。如何让Android在onCreate之后运行此方法?我找到了一些涉及factory模式的Java解决方案,但我不确定如何使用它,如果我能在我的案例中使用它的话。

本身就是一个上下文。因此,如果您只需要上下文,您可以在Serviceclass中调用它

或者,您应该在启动活动之前将其传递给服务。确保在调用super.onCreatebundle后通过活动

但是,您不应该从服务中操纵活动或其视图。更好的方法是通过服务通知您的活动

编辑:观察者模式

创建一个名为NotificationCenter.java的新类

public class NotificationCenter {

    private static int totalEvents = 1;

    public static final int updateActivity = totalEvents++;
    // you can add more events
    // public static final int anotherEvent = totalEvents++;

    private final SparseArray<ArrayList<Object>> observers = new SparseArray<>();
    private final SparseArray<ArrayList<Object>> removeAfterBroadcast = new SparseArray<>();
    private final SparseArray<ArrayList<Object>> addAfterBroadcast = new SparseArray<>();

    private int broadcasting = 0;

    public interface NotificationCenterDelegate {
        void didReceivedNotification(int id, Object... args);
    }

    private static volatile NotificationCenter Instance = null;

    public static NotificationCenter getInstance() {
        NotificationCenter localInstance = Instance;
        if (localInstance == null) {
            synchronized (NotificationCenter.class) {
                localInstance = Instance;
                if (localInstance == null) {
                    Instance = localInstance = new NotificationCenter();
                }
            }
        }
        return localInstance;
    }

    public void postNotificationName(int id, Object... args) {
        broadcasting++;
        ArrayList<Object> objects = observers.get(id);
        if (objects != null && !objects.isEmpty()) {
            for (int a = 0; a < objects.size(); a++) {
                Object obj = objects.get(a);
                ((NotificationCenterDelegate) obj).didReceivedNotification(id, args);
            }
        }
        broadcasting--;
        if (broadcasting == 0) {
            if (removeAfterBroadcast.size() != 0) {
                for (int a = 0; a < removeAfterBroadcast.size(); a++) {
                    int key = removeAfterBroadcast.keyAt(a);
                    ArrayList<Object> arrayList = removeAfterBroadcast.get(key);
                    for (int b = 0; b < arrayList.size(); b++) {
                        removeObserver(arrayList.get(b), key);
                    }
                }
                removeAfterBroadcast.clear();
            }
            if (addAfterBroadcast.size() != 0) {
                for (int a = 0; a < addAfterBroadcast.size(); a++) {
                    int key = addAfterBroadcast.keyAt(a);
                    ArrayList<Object> arrayList = addAfterBroadcast.get(key);
                    for (int b = 0; b < arrayList.size(); b++) {
                        addObserver(arrayList.get(b), key);
                    }
                }
                addAfterBroadcast.clear();
            }
        }
    }

    public void addObserver(Object observer, int id) {
        if (broadcasting != 0) {
            ArrayList<Object> arrayList = addAfterBroadcast.get(id);
            if (arrayList == null) {
                arrayList = new ArrayList<>();
                addAfterBroadcast.put(id, arrayList);
            }
            arrayList.add(observer);
            return;
        }
        ArrayList<Object> objects = observers.get(id);
        if (objects == null) {
            observers.put(id, (objects = new ArrayList<>()));
        }
        if (objects.contains(observer)) {
            return;
        }
        objects.add(observer);
    }

    public void removeObserver(Object observer, int id) {
        if (broadcasting != 0) {
            ArrayList<Object> arrayList = removeAfterBroadcast.get(id);
            if (arrayList == null) {
                arrayList = new ArrayList<>();
                removeAfterBroadcast.put(id, arrayList);
            }
            arrayList.add(observer);
            return;
        }
        ArrayList<Object> objects = observers.get(id);
        if (objects != null) {
            objects.remove(observer);
        }
    }
}
最后,将服务中的消息发送到所有正在侦听的活动:

NotificationCenter.getInstance().postNotificationName(NotificationCenter.updateActivity, optionalData);
这非常好,您不必传递活动实例


NotificationCenter来源于电报。

什么是mService,它是IntatiateDal?因此我们不使用上下文传递在ui线程上进行工作,我们使用广播意图。当我们以另一种方式进行工作时,这是一个大问题吗?整个应用程序都是这样编写的,我不确定我自己是否能够强制进行这样的更改。对不起,不是这样,这只是我从一本书中学到的方法。你可以随心所欲。不,我需要明确当前活动的背景。当用户更改应用程序中的页面时,服务的反应应该会改变。这是否意味着我可以在每次意图之前设置一个启动活动。startActivity只需调用setActivity方法?是的,请确保您的服务具有启动活动,然后实际运行该服务。哦,您的意思是我应该在启动服务之前传递上下文,而不是活动?因此,第一步是设置活动,然后启动服务,当活动更改时,应传递另一个上下文并重新启动服务?无论如何,我会看一看通知方法。没错!您应该这样做以防止出现NullPointerExceptions,因此我确实需要尝试一下这些通知。我有一项服务,只要应用程序弹出并一直在后台运行,它就会立即启动。它基本上保持TCP连接打开,并且应该处理传入的数据包和更新活动,这就是为什么我需要上下文。我不能在myService中使用myActivity作为活动类型,因为我想使用多个自定义活动,它们不适合。此外,无法解析getActivity。很抱歉,它不是get Activity,实际上是getContext或myActivity。此
NotificationCenter.getInstance().postNotificationName(NotificationCenter.updateActivity, optionalData);
public class myService extends Service
{
 public static myActivity activity;

 public static void setActivity(myActivity activity)
 {
     this.activity = activity;
 }
 public void useActivityExample()
{
  myService.myActivity.update();
 }
}

public class myActivity extends AppCompatActivity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
   {
       // ... some things are being executed and myService is being bound
      mService.setActivity(getActivity());
   }
}