"java.lang.Chaîne de android.contenu.Contexte.getPackageName () sur un objet nul de référence
Mon alarmManager est dans le MainActivity il tire toutes les 30 seconde à la MyReceiver
classe, puis à partir de ça je commence le GetLLRD
IntentService classe. Par la suite, je suis en envoyant une demande à partir de la onHandleIntent
méthode pour le Serveur à la suite de laquelle je reçois une Réponse. Maintenant, je veux atteindre les objectifs suivants, à chaque fois que la alarmManager feux dans la MainActivity
je veux passer de l'Intention à partir de la Réponse du Serveur dans le GetLLRD
classe à la Map
classe.
Je l'ai essayé deux fois avec l'intention de code dans le GetLLRD classe avec cette partie Intent intent1 = new Intent(this, Map.class);
j'ai reçu l'intention juste une fois dans le Map
activité. Avec ce Intent intent1 = new Intent(mContext, Map.class);
l'application se bloque et j'ai eu cette erreur ci-dessous. Comment puis-je parvenir à mes fins?
Erreur:
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 classe:
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 classe:
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);
}
}
}
Activité sur la carte:
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);
}
}
}
Edit:
GetLLRD IntentService classe:
if (data != null && !data.isEmpty()) {
Intent localIntent = new Intent(
Constants.BROADCAST_ACTION).putExtra(
"data_list", data);
LocalBroadcastManager.getInstance(this).sendBroadcast(localIntent);
}
À l'intérieur de l'activité sur la Carte:
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);
}
}
};
- Non ce n'est pas le même, c'est différent.
Vous devez vous connecter pour publier un commentaire.
Votre architecture est erronée. Le
IntentService
est créé lorsque vous appelezstartService()
. PuisonCreate()
etonHandleIntent()
est appelé dans le Service. Lors de l'achèvement deonHandleIntent()
, si il n'y a pas d'autres en attente d'Intentions de traiter le Service s'arrête.Vous faites cet appel dans
MainActivity
avant vous appelezstartService()
:Vous ne vous montrez pas comment vous définissez la variable de référence
getLRLD
, mais ce n'est pas d'aller travailler. Le Service n'est pas vraiment créé jusqu'à ce que vous appelezstartService()
.Vous essayez toujours des liens à établir un canal de communication entre le Service et l'Activité. Toutefois, vous utilisez la
IntentService
qui est un non-persistant Service. Il est créé en tant que de besoin et lorsque cela n'a rien à faire, il s'en va. Vous ne pouvez donc pas passer une référence au Service de l'Activité, et aussi vous ne devriez pas passer une référence à l'Activité du Service.Le meilleur moyen de réaliser la communication entre le Service et l'Activité est l'une des opérations suivantes:
Service envoie une diffusion
Intent
avec les données. L'Activité peut enregistrer un BroadcastRecevier à l'écoute de cette.Activité crée un
PendingIntent
contenant les mesures nécessaires, COMPOSANT, etc. et passe le Service comme un "extra" dans leIntent
il utilise lors de l'appel destartService()
. Les appels de Servicesend()
sur quePendingIntent
afin de renvoyer des données de l'Activité.Dans les deux cas, le Service n'a pas besoin de savoir quelque chose au sujet de l'Activité, et l'Activité n'a pas besoin d'une référence vers le Service.
EDIT: Ajout de code pour démarrer l'Activité
Si vous souhaitez démarrer une Activité, vous pouvez le faire dans le
Service.onHandleIntent()
:À l'aide de
Intent.FLAG_ACTIVITY_SINGLE_TOP
permettra d'éviter Android de lancer une nouvelle instance de l'Activité, s'il y a déjà une instance de l'exécution de l'Activité. Dans le cas où l'Activité est déjà en cours d'exécution, vous pouvez obtenir les "extras" de laIntent
en substituantonNewIntent()
dans l'Activité.Si vous utilisez cette approche, vous n'avez pas besoin d'utiliser la diffusion de l'Intention d'envoyer les données à partir du Service de l'Activité.
GetLLRD getLRLD = new GetLLRD();
j'ai essayé de mettre cette ligne ` getLRLD.received_MainActvity_Context(contexte); " aprèsstartService(intent)
mais comme vous l'avez dit, j'obtiens la même erreur. Également dans leonHandleIntent
méthode que je reçois le PendingIntent de la alarmManager toutes les 30 secondes, mais lorsque j'essaie de passer le résultat à partir du Serveur de la Carte de l'activité, l'erreur se produit et la alarmManager cesser le tir le PendingIntent. qui onCreate voulez-vous dire iciThen onCreate() and onHandleIntent() is called in the Service.
?Activity
,Service
,BroadcastReceiver
, etc.) à l'aide de mots clésnew
. Seul le Android-cadre peut instancier ces composants. Aussi, leonCreate()
je me réfère à l'est dans leService
.Intent
voir developer.android.com/training/run-background-service/...onCreate()
dans le IntentService classe j'ai une fois dans MainActivity et dans la Carte. S'il vous plaît pouvez-vous prendre un coup d'oeil a mon modifier le code je suis en train de mettre en œuvre la première Approche.onCreate()
dans votre Service. Je viens juste de décrire ce qui se passe.IntentService
implémenteonCreate()
lui-même.BroadcastReceiver
dans l'Activité. Votre montage est mauvais. Une Intention d'ACTION est juste une Chaîne de caractères. Il suffit de définir une constante de Chaîne commepublic static final String INTENT_ACTION = "MY_INTENT_ACTION";
Map
Activité ainsi, vous pouvez utiliser une autre approche. Vous avez besoin d'avoir de l'appel de ServicestartActivity()
. Vous aviez déjà un code qui n'a que. Je vais l'ajouter à ma réponse.Intent
a de sens que si vous savez que la réception d'Activité est déjà en cours d'exécution et est à l'écoute pour les réponses. Le démarrage d'une Activité de Service a plus de sens si vous ne pouvez pas être sûr que l'Activité est en cours d'exécution et que vous souhaitez lancer l'Activité du Service. Il y a différents scénarios qui nécessitent des solutions différentes.FLAG_ACTIVITY_SINGLE_TOP)
etonNewIntent()
méthode. Merci pour votre Soutien.