我正在尝试创建一个非常简单的Android应用程序,这本来是一个'书呆子'的生日礼物,但只剩下几天才能完成它并且完全没有这样做的经验,所以我想我会问。我几乎在编码内容方面,但在最后一个障碍时真的很困惑。
应用程序应执行以下操作:它应每24小时发出一张新照片等待的通知,并且应从数据库中随机选择新照片(文件夹drawables中的图像)。点击通知后,用户应该被带到新随机选择的照片。 至关重要的是,后续访问应用程序的全天应该会看到相同的图片,这样用户就不能“欺骗”应用程序一次性显示完整的图像数据库。这个特殊功能真的引起了头痛。目前我构建代码的方式如下:我有一个非常简单的MainActivity,其中只有一个按钮。单击该按钮每24小时触发一次通知。通知链接到不同的活动Repeating_activity,在您输入时生成随机图像。这是代码:
public class MainActivity extends AppCompatActivity {
Button button2a;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button2a = (Button) findViewById(R.id.button2);
button2a.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY,17);
calendar.set(Calendar.MINUTE,35);
Intent intent = new Intent(getApplicationContext(),NotificationReciever.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(),100,intent,PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),alarmManager.INTERVAL_DAY,pendingIntent);
}
});
}
}
然后
public class NotificationReciever extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Intent repeating_intent = new Intent(context,Repeating_activity.class);
repeating_intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(context,100,repeating_intent,PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context,"lala")
.setSmallIcon(android.R.drawable.arrow_up_float)
.setContentIntent(pendingIntent)
.setContentText("New photo awaits!")
.setContentTitle("New photo")
.setAutoCancel(true);
notificationManager.notify(100,builder.build());
}
}
最后
public class Repeating_activity extends AppCompatActivity{
ImageView imageView2;
Random r;
Integer[] images = {
R.drawable.image_2,
R.drawable.image_3,
R.drawable.image_8,
};
int pickedImage = 0, lastPicked = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.repeating_activity);
imageView2 = (ImageView) findViewById(R.id.imageView2);
r = new Random();
do {
pickedImage = r.nextInt(images.length);
} while (pickedImage == lastPicked);
lastPicked = pickedImage;
Picasso.with(getApplicationContext()).load(images[pickedImage]).fit().centerInside().into(imageView2);
imageView2.setImageResource(images[pickedImage]);
}
}
通过一些标准的重新调整,例如AndroidManifest中的更改或引入Picasso以避免bitmaps和dpi的问题,这个东西或多或少有效(在模拟器和我的设备上测试)。也就是说,应用程序背后最基本的想法是:出现通知,这会导致显示数据库中的随机图片。在离开应用程序并回到它的同时,也可以在照片仍在显示的意义上工作。但是,只要我们终止应用程序或让它在后台运行足够长时间,它就会恢复为主要活动。此外,检查通知间隔只有几分钟,似乎有一个问题,即后续'天'显示相同的图像(这可能是由于代码中的一些错误?)。
我已经开始阅读活动的生命周期和相应的不同状态,以及我们如何在应用程序终止时检索数据“丢失”(以及通常如何自动完成?)。但正如我所说,这是一个有趣的一次性小项目,所以试图掌握所有看起来有点过分的东西。
回想起来,我也意识到最好不要引入第二项活动。我想最好的方法是从主要活动开始,包括一张固定照片(例如欢迎图片)和底部的按钮。单击按钮会开始每24小时显示一次通知,然后每次出现通知时,它都应链接到主活动,但也会将显示的图像更改为新活动。现在应该保存MainActivity的新状态,以便在终止应用程序后重新输入应用仍然会导致看到随机生成的“当天图像”。
再过几天试图发现自己如何做到这将是非常有趣的,但我没有太多时间,所以任何特别的帮助将不胜感激!将此代码调整为实际上述功能的最快方法是什么?谢谢!