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());
}
}