- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我的 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之间通信的最佳方式是以下之一:
服务发送带有数据的广播Intent
。 Activity 可以注册一个 BroadcastRecevier 来监听。
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/
我已经为使用 JGroups 编写了简单的测试。有两个像这样的简单应用程序 import org.jgroups.*; import org.jgroups.conf.ConfiguratorFact
我有一个通过 ajax 检索的 json 编码数据集。我尝试检索的一些数据点将返回 null 或空。 但是,我不希望将那些 null 或空值显示给最终用户,或传递给其他函数。 我现在正在做的是检查
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Why does one often see “null != variable” instead of “
嗨在我们公司,他们遵循与空值进行比较的严格规则。当我编码 if(variable!=null) 在代码审查中,我收到了对此的评论,将其更改为 if(null!=variable)。上面的代码对性能有影
我正在尝试使用 native Cordova QR 扫描仪插件编译项目,但是我不断收到此错误。据我了解,这是代码编写方式的问题,它向构造函数发送了错误的值,或者根本就没有找到构造函数。那么我该如何解决
我在装有 Java 1.8 的 Windows 10 上使用 Apache Nutch 1.14。我已按照 https://wiki.apache.org/nutch/NutchTutorial 中提
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: what is “=null” and “ IS NULL” Is there any difference bet
Three-EyedRaven 内网渗透初期,我们都希望可以豪无遗漏的尽最大可能打开目标内网攻击面,故,设计该工具的初衷是解决某些工具内网探测速率慢、运行卡死、服务爆破误报率高以及socks流
我想在Scala中像在Java中那样做: public void recv(String from) { recv(from, null); } public void recv(String
我正在尝试从一组图像补丁中创建一个密码本。我已将图像(Caltech 101)分成20 X 20图像块。我想为每个补丁创建一个SIFT描述符。但是对于某些图像补丁,它不返回任何描述符/关键点。我尝试使
我在验证器类中自动连接的两个服务有问题。这些服务工作正常,因为在我的 Controller 中是自动连接的。我有一个 applicationContext.xml 文件和 MyApp-servlet.
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 已关闭10 年前。 问题必须表现出对要解决的问题的最低程度的了解。告诉我们您尝试过做什么,为什么不起作用,以
大家好,我正在对数据库进行正常的选择,但是 mysql_num_rowsis 为空,我不知道为什么,我有 7 行选择。 如果您发现问题,请告诉我。 真的谢谢。 代码如下: function get_b
我想以以下格式创建一个字符串:id[]=%@&stringdata[]=%@&id[]=%@&stringdata[]=%@&id[]=%@&stringdata[]=%@&等,在for循环中,我得到
我正在尝试使用以下代码将URL转换为字符串: NSURL *urlOfOpenedFile = _service.myURLRequest.URL; NSString *fileThatWasOpen
我正在尝试将NSNumber传递到正在工作的UInt32中。然后,我试图将UInt32填充到NSData对象中。但是,这在这里变得有些时髦... 当我尝试将NSData对象中的内容写成它返回的字符串(
我正在进行身份验证并收到空 cookie。我想存储这个 cookie,但服务器没有返回给我 cookie。但响应代码是 200 ok。 httpConn.setRequestProperty(
我认为 Button bTutorial1 = (Button) findViewById(R.layout.tutorial1); bTutorial1.setOnClickListener
我的 Controller 中有这样的东西: model.attribute("hiringManagerMap",hiringManagerMap); 我正在访问此 hiringManagerMap
我想知道如何以正确的方式清空列表。在 div 中有一个列表然后清空 div 或列表更好吗? 我知道这是一个蹩脚的问题,但请帮助我理解这个 empty() 函数:) 案例)如果我运行这个脚本会发生什么:
我是一名优秀的程序员,十分优秀!