繁体   English   中英

如何从android中的普通类调用main_activity的方法

[英]how to call a method of a main_activity from a normal class in android

嗨,我在android后台进程中使用此帖子android上后台进程计时器

我在主要活动中的计时器代码是

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);

我在processTimerReceiver类中的代码是:

public class processTimerReceiver extends BroadcastReceiver {

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

}

}

我想在主要活动中调用方法get_start_info(),但应用崩溃

我的主要活动是:

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());
}

}

我的错误是:

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) 

首先,如果要在MainActivity之外调用get_start_info() ,则将get_start_info()sendNotification移出MainActivity。

之所以得到NullPointerException是因为尝试使用MainActivity的上下文在sendNotification内构建通知,而该上下文为null,因为您正在使用new关键字实例化MainActivity (不应使用new关键字实例化新活动)。 而是将BroadcastReceiver的上下文作为参数传递给sendNotification并使用它来构建通知。

使用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);

在这里,不要使用this ,而应该使用作为参数传递的Context

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM