gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:33:35 25 4
gpt4 key购买 nike

嗨,我使用这篇文章Background process timer on android对于后台进程中的计时器

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

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

}

}

我想在主 Activity 中调用 get_start_info() 方法,但应用程序崩溃了

我的主要 Activity 是:

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 关键字实例化新 Activity )。相反,将 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);

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

关于java - 如何从android中的普通类调用main_activity的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46735898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com