Как я могу вызвать свое уведомление от метода?

Я пытаюсь вызвать уведомление внизу. Я следовал этому примеру кода http://www.compiletimeerror.com/2013/10/status-bar-notification-example-in.html

Я могу вызвать уведомление при вызове метода из моей HomeActivity, которая является моей основной деятельностью для приложения. При попытке вызвать один из методов в приложении ничего не происходит. (например)

HomeActivity homeactivity = new HomeActivity();
homeactivity.Notify("Title: ...", "Msg: ... ");

Вот журналы для события. Я запускаю оповещение после 5 нажатий кнопок

05-31 18:33:41.533  10118-10118/com.myapp.md E/>>>>>>﹕ MultiClickEvent clickCount = 5
05-31 18:33:41.543  10118-10118/com.myapp.md E/>>>>>>>﹕ in onActivation of HWReceiver
05-31 18:33:41.603  10118-10118/com.myapp.md V/Vibrator﹕ Called vibrate(long) API - PUID: 10588, PackageName: com.myapp.md
05-31 18:33:41.603  10118-10118/com.myapp.md V/Vibrator﹕ vibrate - PUID: 10588, PackageName: com.myapp.md, ms: 3000, mag: -1
05-31 18:33:41.643  10118-10118/com.myapp.md D/AbsListView﹕ onVisibilityChanged() is called, visibility : 4
05-31 18:33:41.643  10118-10118/com.myapp.md D/AbsListView﹕ unregisterIRListener() is called
05-31 18:33:41.643  10118-10118/com.myapp.md D/AbsListView﹕ onVisibilityChanged() is called, visibility : 4
05-31 18:33:41.643  10118-10118/com.myapp.md D/AbsListView﹕ unregisterIRListener() is called
05-31 18:33:41.643  10118-11068/com.myapp.md E/>>>>>>﹕ in CurrentLocationProvider CONSTRUCTOR - trying to retrieve location from getLastKnownLocation()
05-31 18:33:41.833  10118-11068/com.myapp.md I/com.myapp.md.alert.SMSAdapter﹕ Sms sent: I need IMMEDIATE help! - I'm here https://maps.google.com/maps?q=40.7348922,-73.977548 via network
05-31 18:33:44.883  10118-10118/com.myapp.md E/>>>>>>>﹕ in onReceive of HWReceiver
05-31 18:33:44.883  10118-10118/com.myapp.md E/>>>>>>>﹕ in onReceive of HWReceiver context com.myapp.md.trigger.HardwareTriggerService@429b89b0
05-31 18:33:44.883  10118-10118/com.myapp.md E/>>>>>>>﹕ in onReceive of HWReceiver intent Intent { act=android.intent.action.SCREEN_ON flg=0x50000010 }

Я пытался поместить уведомление в моем SMSAdapter

public class SMSAdapter {
    private static final String LOG_TAG = SMSAdapter.class.getName();

    public void sendSMS(Context context, String phoneNumber, String message) {
//        Log.e("20140411", "sending fake SMS -> " + message);
        if(!ApplicationSettings.isFirstMsgSent(context)){
            ApplicationSettings.setFirstMsgSent(context, true);
        }
        SmsManager smsManager = getSmsManager();
        try {
            smsManager.sendTextMessage(phoneNumber, null, message, null, null);
            Log.i(LOG_TAG, "Sms sent: " + message);
            HomeActivity homeactivity = new HomeActivity();
            homeactivity.Notify("Title: Text SOS",
                    "Msg: Alerting your emergency contacts ");
        } catch (Exception exception) {
            Log.e(LOG_TAG, "Sending SMS failed " + exception.getMessage());
        }
    }

    SmsManager getSmsManager() {
        return SmsManager.getDefault();
    }
}

Когда я делаю это, я получаю это сообщение

05-31 18:39:33.163  18640-19982/com.textsosalert.md E/>>>>>>﹕ in CurrentLocationProvider CONSTRUCTOR - trying to retrieve location from getLastKnownLocation()
05-31 18:39:33.383  18640-19982/com.textsosalert.md I/com.textsosalert.md.alert.SMSAdapter﹕ Sms sent: I need IMMEDIATE help! - I'm here https://maps.google.com/maps?q=40.7348689,-73.9775756 via network
05-31 18:39:33.383  18640-19982/com.textsosalert.md E/com.textsosalert.md.alert.SMSAdapter﹕ Sending SMS failed Can't create handler inside thread that has not called Looper.prepare()

Вот метод уведомления, который я определил:

@SuppressWarnings("deprecation")
public void Notify(String notificationTitle, String notificationMessage) {
    NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    @SuppressWarnings("deprecation")
    Notification notification = new Notification(R.drawable.icon_sos,
            "New Message", System.currentTimeMillis());

    Intent notificationIntent = new Intent(this, HomeActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
            notificationIntent, 0);

    notification.setLatestEventInfo(HomeActivity.this, notificationTitle,
            notificationMessage, pendingIntent);
    notificationManager.notify(9999, notification);
}

1 ответ

Решение

Проблема в том, что ты звонишь new HomeActivity()Это то, что вы никогда не должны делать. Действия в Android всегда начинают использовать startActivity() или же startActivityForResult()и никогда не должен создаваться явно с new,

Когда вы звоните new HomeActivity()ни один из обратных вызовов жизненного цикла действия не вызывается, поэтому у действия не будет допустимого контекста.

Так что, это просто не сработает:

HomeActivity homeactivity = new HomeActivity();
homeactivity.Notify("Title: ...", "Msg: ... ");

Если вы хотите иметь метод, который вы можете повторно использовать в разных местах своего кода, поместите его в отдельный класс и попросите метод взять Context в качестве параметра.

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;

public class MyNotification {

    @SuppressWarnings("deprecation")
    public static void notify(Context context, String notificationTitle, String notificationMessage) {
        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        @SuppressWarnings("deprecation")
        Notification notification = new Notification(R.drawable.icon_sos,
                "New Message", System.currentTimeMillis());

        Intent notificationIntent = new Intent(context, HomeActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
                notificationIntent, 0);

        notification.setLatestEventInfo(context, notificationTitle,
                notificationMessage, pendingIntent);
        notificationManager.notify(9999, notification);
    }
}

Тогда в SMSAdapter вы получите:

    try {
        smsManager.sendTextMessage(phoneNumber, null, message, null, null);
        Log.i(LOG_TAG, "Sms sent: " + message);
        /* Don't do this:
        HomeActivity homeactivity = new HomeActivity();
        homeactivity.Notify("Title: Text SOS",
                "Msg: Alerting your emergency contacts ");
        */

        //Do this instead:
        MyNotification.notify(context, "Title: Text SOS",
                "Msg: Alerting your emergency contacts ");

    } catch (Exception exception) {
        Log.e(LOG_TAG, "Sending SMS failed " + exception.getMessage());
    }

Также обратите внимание, что вы можете вызвать это из HomeActivity, используя this как context:

 MyNotification.notify(this, "Title: Text SOS",
                "Msg: Alerting your emergency contacts ");
Другие вопросы по тегам