'java.lang.String android.content.Context.getPackageName()' on a null object reference -


my alarmmanager in mainactivity fires every 30 second myreceiver class start getllrd intentservice class. thereafter, sending request onhandleintent method server following getting response. want achieve following, every time alarmmanager fires in mainactivity want pass intent response server in getllrd class map class.

i have tried twice intent's code in getllrd class part intent intent1 = new intent(this, map.class); received intent once in map activity. 1 intent intent1 = new intent(mcontext, map.class); app crashes , got error below. how can achieve purposes?

error:

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 invoke virtual method 'java.lang.string android.content.context.getpackagename()' on null object reference 07-08 13:04:33.482: e/androidruntime(16838):    @ android.content.componentname.<init>(componentname.java:77) 07-08 13:04:33.482: e/androidruntime(16838):    @ android.content.intent.<init>(intent.java:4570) 07-08 13:04:33.482: e/androidruntime(16838):    @ com.bustracker.getllrd.onhandleintent(getllrd.java:98) 07-08 13:04:33.482: e/androidruntime(16838):    @ android.app.intentservice$servicehandler.handlemessage(intentservice.java:65) 07-08 13:04:33.482: e/androidruntime(16838):    @ android.os.handler.dispatchmessage(handler.java:102) 07-08 13:04:33.482: e/androidruntime(16838):    @ android.os.looper.loop(looper.java:145) 07-08 13:04:33.482: e/androidruntime(16838):    @ 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 class:

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 class:

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 try in way receiving data intent once in map activity.                              intent intent1 = new intent(this, map.class);                              intent1.putextra("list_data", data);                              intent1.addflags(intent.flag_activity_new_task);                              startactivity(intent1);                 //when in way getting 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");                 (itemdto itemdto : list) {                     double latitude = itemdto.getlatitude();                     double longitude = itemdto.getlongitude();                     int route = itemdto.getroute();                     string direction = itemdto.getdirection();                     system.out.println("test map activity:  " + latitude + ", " + longitude                             + ", " + ", " + route + ", " + direction);                  }         }            } 

edit:

getllrd intentservice class:

            if (data != null && !data.isempty()) {                                             intent localintent = new intent(                                 constants.broadcast_action).putextra(                                 "data_list", data);                         localbroadcastmanager.getinstance(this).sendbroadcast(localintent);             }  

inside 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");         (itemdto itemdto : list) {             double latitude = itemdto.getlatitude();             double longitude = itemdto.getlongitude();             int route = itemdto.getroute();             string direction = itemdto.getdirection();             system.out.println("test apple activity:  " + latitude                     + ", " + longitude + ", " + ", " + route + ", "                     + direction);          }      }  }; 

your architecture flawed. intentservice created when call startservice(). oncreate() , onhandleintent() called in service. upon completion of onhandleintent(), if there no other pending intents processed service stops.

you making call in mainactivity before call startservice():

getlrld.received_mainactvity_context(context); 

you don't show how setting reference variable getlrld, isn't going work. service isn't created until call startservice().

you trying establish communcations channel between service , activity. however, using intentservice non-persistent service. gets created needed , when has nothing goes away. therefore cannot pass reference service activity, , should not pass reference activity service.

the best way achieve communication between service , activity 1 of following:

  1. service sends broadcast intent data. activity can register broadcastrecevier listen this.

  2. activity creates pendingintent containing necessary action, component, etc. , passes service "extra" in intent uses when calling startservice(). service calls send() on pendingintent in order return data activity.

in both cases service doesn't need know activity, , activity doesn't need reference service.

edit: add code start activity

if want start activity, can in 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); 

using intent.flag_activity_single_top prevent android launching new instance of activity, if there instance of activity running. in case activity running, can "extras" intent overriding onnewintent() in activity.

if use approach don't need use broadcast intent send data service activity.


Comments

Popular posts from this blog

toolbar - How to add link to user registration inside toobar in admin joomla 3 custom component -

linux - disk space limitation when creating war file -