2017-10-13 3 views
1

Salut j'utiliser ce poste Background process timer on android pour le timeer dans le processus d'arrière-plancomment appeler une méthode d'un main_activity d'une classe normale dans Android

mon code d'horloge de l'activité principale est

int repeatTime = 5; 
    AlarmManager processTimer = (AlarmManager)getSystemService(ALARM_SERVICE); 
    Intent intent = new Intent(this, processTimerReceiver.class); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    processTimer.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),repeatTime*1000, pendingIntent); 

et mon code en classe processTimerReceiver est:

public class processTimerReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    MainActivity m = new MainActivity(); 
    m.get_start_info(); 

} 

} 

je veux appeler la méthode get_start_info() dans l'activité principale, mais l'application est écrasé

complète mon activité principale est:

public class MainActivity extends AppCompatActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
    setContentView(R.layout.activity_main); 


    int repeatTime = 5; 
    AlarmManager processTimer = (AlarmManager)getSystemService(ALARM_SERVICE); 
    Intent intent = new Intent(this, processTimerReceiver.class); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    processTimer.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),repeatTime*1000, pendingIntent); 

    get_start_info(); 

} 

public void get_start_info() { 
    JsonArrayRequest movieReq = new JsonArrayRequest("www.example.com", 
      new Response.Listener<JSONArray>() { 
       @Override 
       public void onResponse(JSONArray response) { 
        try { 
         JSONObject obj = response.getJSONObject(0); 
         // any 

         sendNotification(); 

         //any 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 

       } 
      }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 

     } 
    }); 
    AppController.getInstance().addToRequestQueue(movieReq); 
} 

public void sendNotification() { 


    NotificationCompat.Builder builder = new NotificationCompat.Builder(this); 
    builder.setSmallIcon(android.R.drawable.ic_dialog_email); 
    Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
    Intent intent = new Intent(MainActivity.this, azegar_mail_list.class); 
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0); 


    //mp.start(); 
    builder.setContentIntent(pendingIntent); 
    builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher)); 
    builder.setContentTitle("آزگار"); 
    builder.setContentText("نامه جدید برای شما ارسال شده است"); 
    builder.setAutoCancel(true); 
    builder.setSound(soundUri); 

    NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 

    // Will display the notification in the notification bar 
    notificationManager.notify(1, builder.build()); 
} 

} 

mon erreur est:

E/AndroidRuntime: FATAL EXCEPTION: main 
       java.lang.RuntimeException: Unable to start receiver com.azegar.www.azegar.processTimerReceiver: java.lang.NullPointerException 
        at android.app.ActivityThread.handleReceiver(ActivityThread.java:2539) 
        at android.app.ActivityThread.access$1500(ActivityThread.java:167) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1432) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loop(Looper.java:153) 
        at android.app.ActivityThread.main(ActivityThread.java:5341) 
        at java.lang.reflect.Method.invokeNative(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:511) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:929) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696) 
        at dalvik.system.NativeStart.main(Native Method) 
       Caused by: java.lang.NullPointerException 
        at android.content.ContextWrapper.getResources(ContextWrapper.java:89) 
        at android.view.ContextThemeWrapper.getResources(ContextThemeWrapper.java:78) 
        at android.support.v7.app.AppCompatActivity.getResources(AppCompatActivity.java:551) 
        at android.content.Context.getString(Context.java:327) 
        at com.azegar.www.azegar.MainActivity.get_start_info(MainActivity.java:438) 
        at com.azegar.www.azegar.processTimerReceiver.onReceive(processTimerReceiver.java:12) 
        at android.app.ActivityThread.handleReceiver(ActivityThread.java:2532) 
        at android.app.ActivityThread.access$1500(ActivityThread.java:167)  
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1432)  
        at android.os.Handler.dispatchMessage(Handler.java:99)  
        at android.os.Looper.loop(Looper.java:153)  
        at android.app.ActivityThread.main(ActivityThread.java:5341)  
        at java.lang.reflect.Method.invokeNative(Native Method)  
        at java.lang.reflect.Method.invoke(Method.java:511)  
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:929)  
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)  
        at dalvik.system.NativeStart.main(Native Method)  

Répondre

2

Tout d'abord, si vous appelez en dehors de get_start_info() theMainActivity, puis déplacez get_start_info() et sendNotification sur MainActivity.

Vous obtenez un NullPointerException parce que vous essayez d'utiliser le contexte de MainActivity pour construire une notification à l'intérieur sendNotification et que le contexte est nul parce que vous instancier MainActivity avec le nouveau mot-clé (Vous ne devriez pas instancier une nouvelle activité avec le nouveau mot-clé) . Au lieu de cela, passez le contexte BroadcastReceiver en tant que paramètre à sendNotification et utilisez-le pour générer la notification.

parties du code qui utilise Context:

NotificationCompat.Builder builder = new NotificationCompat.Builder(this); 
Intent intent = new Intent(MainActivity.this, azegar_mail_list.class); 
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0); 

Ici, instad d'utiliser this, vous devez utiliser le Context passé en paramètre.

+0

Salut merterpam votre code est très bon ce code fonctionne pour moi merci – ebrahim

+0

Salut ebrehim, merci et bienvenue à Stackoverflow =). Si vous êtes satisfait de la réponse et souhaitez clôturer la question, veuillez marquer la réponse comme acceptée. – merterpam