【发布时间】:2015-07-08 11:36:57
【问题描述】:
我的 alarmManager 在 MainActivity 中,它每 30 秒触发一次 MyReceiver 类,然后我从它开始 GetLLRD IntentService 类。此后,我从onHandleIntent 方法向服务器发送一个请求,然后我得到一个响应。现在我想实现以下目标,每次在MainActivity 中触发alarmManager 时,我都想将GetLLRD 类中来自服务器的响应中的Intent 传递给Map 类。
我已经使用 GetLLRD 类中的意图代码尝试了两次,这部分 Intent intent1 = new Intent(this, Map.class); 我在 Map 活动中只收到了一次意图。有了这个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)
MainActivity:
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);
}
}
}
地图活动:
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);
}
地图活动内部:
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);
}
}
};
【问题讨论】:
-
@Selvin: 不一样是不一样的。
标签: android android-intent arraylist