gpt4 book ai didi

android - 空对象引用上的“java.lang.String android.content.Context.getPackageName()”

转载 作者:搜寻专家 更新时间:2023-11-01 08:42:20 24 4
gpt4 key购买 nike

我的 alarmManager 在 MainActivity 中,它每 30 秒触发一次 MyReceiver 类,然后从它启动 GetLLRD IntentService 类。此后,我从 onHandleIntent 方法向服务器发送请求,随后我收到响应。现在我想实现以下目标,每次 alarmManager 在 MainActivity 中触发时,我想将 GetLLRD 类中来自服务器的响应中的 Intent 传递给 映射类。

我已经用 GetLLRD 类中的 Intent 代码尝试了两次 Intent intent1 = new Intent(this, Map.class); 我只在 中收到了一次 Intent map Activity 。有了这个 Intent intent1 = new Intent(mContext, Map.class); 应用程序崩溃了,我在下面收到了这个错误。我怎样才能实现我的目标?

错误:

07-08 13:04:33.482: E/AndroidRuntime(16838): FATAL EXCEPTION: IntentService[IntentService]
07-08 13:04:33.482: E/AndroidRuntime(16838): Process: com.bustracker, PID: 16838
07-08 13:04:33.482: E/AndroidRuntime(16838): java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
07-08 13:04:33.482: E/AndroidRuntime(16838): at android.content.ComponentName.<init>(ComponentName.java:77)
07-08 13:04:33.482: E/AndroidRuntime(16838): at android.content.Intent.<init>(Intent.java:4570)
07-08 13:04:33.482: E/AndroidRuntime(16838): at com.bustracker.GetLLRD.onHandleIntent(GetLLRD.java:98)
07-08 13:04:33.482: E/AndroidRuntime(16838): at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
07-08 13:04:33.482: E/AndroidRuntime(16838): at android.os.Handler.dispatchMessage(Handler.java:102)
07-08 13:04:33.482: E/AndroidRuntime(16838): at android.os.Looper.loop(Looper.java:145)
07-08 13:04:33.482: E/AndroidRuntime(16838): at android.os.HandlerThread.run(HandlerThread.java:61)

主要 Activity :

public class MainActivity extends ActionBarActivity{
Context context;

getLRLD.received_MainActvity_Context(context);
Intent intent = new Intent(MainActivity.this,
IntentReceiver.class);
intent.putExtra("json_data", json);
PendingIntent pendingIntent = PendingIntent.getBroadcast(
getApplicationContext(), 1, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Calendar cal = Calendar.getInstance();
alarm.setRepeating(AlarmManager.RTC_WAKEUP,
System.currentTimeMillis(), 30 * 1000,
pendingIntent);
startService(intent);

}

MyReceiver 类:

public class MyReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
try {
String action = intent.getStringExtra("json_data");

if (!action.isEmpty()) {

startService(context, action);

}
} catch (Exception e) {
}
}

public void startService(Context context, String action) {
Intent inetent = new Intent(context, GetLLRD.class);
inetent.putExtra("json_data", action);
context.startService(inetent);
}

}

GetLLRD 类:

public class GetLLRD extends IntentService {
Context mContext;

public GetLLRD() {
super("IntentService");

}
public void received_MainActvity_Context(Context context){
this.mContext = context;


}

@Override
protected void onHandleIntent(Intent intent) {

String jSONString = intent.getStringExtra("json_data");

if (jSONString != null) {
//So if I try it in this way I am just receiving the data intent just once in the Map activity.
Intent intent1 = new Intent(this, Map.class);
intent1.putExtra("list_data", data);
intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent1);

//When I do it in this way I am getting the error above:
Intent intent1 = new Intent(mContext, Map.class);
intent1.putExtra("list_data", data);
intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent1);

}
}
}

map Activity :

public class Map extends ActionBarActivity{

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Intent intent = getIntent();
@SuppressWarnings("unchecked")
ArrayList<ItemDTO> list =(ArrayList<ItemDTO>) intent.getSerializableExtra("list_data");
for (ItemDTO itemDTO : list) {
double latitude = itemDTO.getLatitude();
double longitude = itemDTO.getLongitude();
int route = itemDTO.getRoute();
String direction = itemDTO.getDirection();
System.out.println("test from Map activity: " + latitude + ", " + longitude
+ ", " + ", " + route + ", " + direction);

}
}
}

编辑:

GetLLRD IntentService 类:

            if (data != null && !data.isEmpty()) {
Intent localIntent = new Intent(
Constants.BROADCAST_ACTION).putExtra(
"data_list", data);
LocalBroadcastManager.getInstance(this).sendBroadcast(localIntent);
}

在 map Activity 中:

onCraete(Bundle savedInstanceState){
IntentFilter data_filter = new IntentFilter();
data_filter.addAction(Constants.BROADCAST_ACTION);
registerReceiver(data_receiver, data_filter);
}


final BroadcastReceiver data_receiver = new BroadcastReceiver() {

@Override
public void onReceive(Context context, Intent intent) {
@SuppressWarnings("unchecked")
ArrayList<ItemDTO> list = (ArrayList<ItemDTO>) intent
.getSerializableExtra("list_data");
for (ItemDTO itemDTO : list) {
double latitude = itemDTO.getLatitude();
double longitude = itemDTO.getLongitude();
int route = itemDTO.getRoute();
String direction = itemDTO.getDirection();
System.out.println("test from Apple activity: " + latitude
+ ", " + longitude + ", " + ", " + route + ", "
+ direction);

}

}

};

最佳答案

您的架构存在缺陷。 IntentService 是在您调用 startService() 时创建的。然后在Service中调用onCreate()onHandleIntent()onHandleIntent() 完成后,如果没有其他待处理的 Intent 需要处理,则服务停止。

您在 MainActivity 调用 startService() 之前进行此调用:

getLRLD.received_MainActvity_Context(context);

您没有显示如何设置引用变量 getLRLD,但这不会起作用。在您调用 startService() 之前,实际上并没有创建服务。

您正在尝试在服务和 Activity 之间建立通信 channel 。但是,您使用的是非持久性服务 IntentService。它会根据需要创建,当它无事可做时就会消失。因此,您不能将对服务的引用传递给 Activity ,也不应将对 Activity 的引用传递给服务。

实现Service和Activity之间通信的最佳方式是以下之一:

  1. 服务发送带有数据的广播Intent。 Activity 可以注册一个 BroadcastRecevier 来监听。

  2. Activity 创建一个包含必要的 ACTION、COMPONENT 等的 PendingIntent,并将其作为 Intent 中的“额外”传递给服务调用 startService()。服务调用 PendingIntent 上的 send() 以便将数据返回到 Activity。

在这两种情况下,服务不需要了解 Activity 的任何信息, Activity 也不需要对服务的引用。

编辑:添加代码以启动 Activity

如果你想启动一个Activity,你可以在Service.onHandleIntent()中这样做:

Intent intent1 = new Intent(this, Map.class);
intent1.putExtra("list_data", data);
intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent1);

使用 Intent.FLAG_ACTIVITY_SINGLE_TOP 将阻止 Android 启动新的 Activity 实例(如果已经有一个 Activity 实例在运行)。如果 Activity 已经在运行,您可以通过覆盖 Activity 中的 onNewIntent()Intent 获取“extras”。

如果您使用这种方法,则无需使用广播 Intent 将数据从 Service 发送到 Activity。

关于android - 空对象引用上的“java.lang.String android.content.Context.getPackageName()”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31291498/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com