如何知道用户不执行应用程序时发出通知

时间:2015-07-27 13:32:07

标签: android timer notifications sms

我想做一个通知,开始计算用户退出Android应用程序的时间。如果用户在1小时后没有执行应用程序,它通知我执行,如果用户忽略它,它执行保存的SMS消息。我在计时器上找到了一些例子,但我不知道如何找到应用程序退出时间。请给我一些完整代码的建议。我迫切需要它......

TimerTask task = new TimerTask(){
    public void run() {
        try {
            mainTime++;
            int min = mainTime / 60;
            int sec = mainTime % 60;
            String strTime = String.format("%s : %s", min, sec);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
};

Timer mTimer = new Timer();
mTimer.schedule(task, 0, 60000);
Intent sendIntent = new Intent(Intent.ACTION_VIEW);
sendIntent.putExtra("Chack your app", smsBody);                 
sendIntent.putExtra("12345678", phonenumber);               
sendIntent.setType("vnd.android-dir/mms-sms");
startActivity(sendIntent);

2 个答案:

答案 0 :(得分:1)

好的,您需要做的是在应用程序退出时在本地存储系统时间(可能正在使用SharedPreferences)。您可以注册BroadcastReceiver,这将有助于您在退出应用程序的本地存储时间过去1小时或特定时间后触发某些操作。

如果您想知道如何以编程方式处理何时以及如何退出应用,请参阅this answer

答案 1 :(得分:1)

您也可以尝试使用Android闹钟系统。用户退出应用程序后,您可以设置警报。类似的东西:

<强> YourActivityOrFragment.java

@Override
protected void onStop() {
   Calendar c = Calendar.getInstance();
            c.setTimeInMillis(System.currentTimeMillis());
            c.add(Calendar.HOUR,1);
            scheduleAlarm(c.getTimeInMillis());
}

private void scheduleAlarm(long time) {
   Intent yourIntent = new Intent("Some_ID");

   PendingIntent pi = PendingIntent.getBroadcast(YourClass.this, ALARM_ID, yourIntent, PendingIntent.FLAG_CANCEL_CURRENT);

// Put some extras here, if you need so. Like:
// yourIntent.putExtra("field","value");

AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

am.set(AlarmManager.RTC_WAKEUP,time,pi);
}

现在,创建一个BroadcastReceiver来处理这些警报。

<强> AlarmReceiver.java

public class AlarmReceiver extends BroadcastReceiver {

private static final String LOG_TAG = AlarmReceiver.class.getSimpleName();

@Override
public void onReceive(Context context, Intent intent) {

    Log.d(LOG_TAG, "Alarm fired!");

    Intent it = new Intent(context, YourNotificationHandler.class);

    // Get your Extras here. And do whatever you want, if you need.

    // For what you said, there's no need to start an Activity, so let's handle that alarm as a service.

    context.startService(it);

   // But if for some reason you want to start an Activity, just do it like: 
   // context.startActivity(it);
}

}

AndroidManifest.xml声明您的BroadcastReceiver

<receiver android:name=".AlarmReceiver" >
    <intent-filter>
        <action android:name="Some_ID" />

        <category android:name="android.intent.category.default" />
    </intent-filter>
</receiver>

最后,创建您的服务来处理您的通知,您可以尝试类似IntentService的内容。在该文件中,您将拥有onHandleIntent(Intent intent)方法。让你的意图在那里,它是额外的,并做你想做的任何事情。稍后,只需致电您的通知。我在我的项目中使用了一个实用程序类来处理这些,但随意选择你将如何做到这一点。

示例:

public static void createService(Context context, CharSequence tickerMessage, CharSequence title,
                                     CharSequence message, int icon, int id, Intent intent, long[] pattern, Boolean autoCancel) {

    PendingIntent p = PendingIntent.getService(context, 0, intent, 0);
    Notification n;
    int apiLevel = Build.VERSION.SDK_INT;

    if (apiLevel >= 11) {
        NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
                .setContentTitle(title)
                .setTicker(tickerMessage)
                .setContentText(message)
                .setSmallIcon(icon)
                .setContentIntent(p)
                .setPriority(NotificationCompat.PRIORITY_DEFAULT);

        if (pattern.length > 0) {
            builder.setVibrate(pattern);
        }

        if (autoCancel != null) {
            builder.setAutoCancel(autoCancel);
        }

        if (apiLevel >= 17) {
            // Android 4.2+
            n = builder.build();
        }
        else {
            // Android 3.x
            n = builder.getNotification();
        }
    }
    else {
        // Android 2.2+
        n = new Notification(icon, tickerMessage, System.currentTimeMillis());
        // Data
        n.setLatestEventInfo(context, title, message, p);
    }

    NotificationManager nm = (NotificationManager)
            context.getSystemService(Activity.NOTIFICATION_SERVICE);

    nm.notify(id, n);
}

您可以阅读有关警报here的更多信息。 有关Service here的更多信息。 BroadcastReceiver here。 通知,herehere。 而this也可能是关于Notification的有趣读物。