我想做一个通知,开始计算用户退出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);
答案 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。
通知,here和here。
而this也可能是关于Notification
的有趣读物。