PDA

View Full Version : نمایش notification سر ساعت خاص



gilas1368
یک شنبه 06 مهر 1393, 18:06 عصر
سلام ب همه

دوستان، اساتید, علما و هرکسی ک دست اندر کاره
شما رو ب هرچی مقدساته قسم

بابا من میخام ی notification رو هر روز سر ساعت 9 شب نمایش بدم
اما بلد نیستم، فک نمیکنم بلد نبودن عیب باشه
رفرنسای گوگلم خوندم، stackowerflow رو هم خوندم
اما چیزی نفهمیدم

خودم ی سرویس نوشتم با اسم NotificationService و کد زیر:



public class NotificationService extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}


@Override
public int onStartCommand(Intent intent, int flags, int startId) {
SetTime();
return START_STICKY;
}


@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(this,"Stop",Toast.LENGTH_LONG).show();
}


private void SetTime() {
Intent intent = new Intent(this, NotificationReciver.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);


Calendar alarmCalendar=Calendar.getInstance();
alarmCalendar.setTimeInMillis(System.currentTimeMi llis( ));
alarmCalendar.set(Calendar.HOUR_OF_DAY, 5);
alarmCalendar.set(Calendar.MINUTE, 16);
alarmCalendar.set(Calendar.SECOND, 0);


AlarmManager manager = (AlarmManager) (this.getSystemService(Context.ALARM_SERVICE));
manager.set(AlarmManager.RTC_WAKEUP, alarmCalendar.getTimeInMillis(), pendingIntent);
manager.setInexactRepeating(AlarmManager.RTC_WAKEU P, alarmCalendar.getTimeInMillis(),AlarmManager.INTER VAL_DAY, pendingIntent);


}
}


ی کلاسم ب اسم NotificationReciver دارم ک برای نمایش notification استفاده میکنم و کدش اینه:



public class NotificationReciver extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ShowNotification();
}


private void ShowNotification(){
Intent intent1 = new Intent(this, MainActivity.class);
PendingIntent pendingIntent1 = PendingIntent.getActivity(this, 0, intent1, 0);


NotificationManager mNotificationManager =(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);


int notifyID = 2;
Notification mNotifyBuilder = new NotificationCompat.Builder(this)
.setContentTitle("Feelinger")
.setContentText("How are you feeling today?")
.setSmallIcon(R.drawable.ic_launcher).setContentIn tent(pendingIntent1).build();


mNotificationManager.notify(notifyID,mNotifyBuilde r);
}
}

و توی اکتیویتی اصلیم هم با کد
startService(new Intent(getBaseContext(),NotificationService.class) ); سرویس رو فراخوانی میکنم.


اما کار نمیکنه و سر ساعتی ک تنظیم کردم notification رو نمایش نمیده


اگ کسی بلده ک چطور میتونم مشکلم رو حل کنم راهنمایی کنه

ثواب داره

rubiks.kde
یک شنبه 06 مهر 1393, 21:17 عصر
ببین دوست عزیز بلد نبودن عیب نیست.

خوب به این صورت که میگم برو جلو.

اول یه کلاس درست میکنی به اسم OnAlarmReceiver : که هر بار از این طریق متوجه میشی که الارم وقتش شده و توی این کلاس سرویس مورد نظر رو فراخوانی میکنی.

public class OnAlarmReceiver extends BroadcastReceiver { @Override
public void onReceive(Context context, Intent intent) {
context.startService(new Intent(context, AppService.class));
}
}

حالا یه کلاس سرویس به اسم AppService هم مینویسی و مثلا اون کاری که میخوایی انجام بشه رو توی مینویسی مثلا من پیام توی سرور رو چک میکنم

public class AppService extends Service {

private static String TAG = "AppService";

@Override
public IBinder onBind(Intent intent) {
return null;
}


@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG, "start job");
ChechMessage();
Log.i(TAG, "stop job");
return START_STICKY;
}


}

خوب تا الان راه رو رفتی جلو حالا باید آلارم رو راه بندازی اونم به این صورت ،البته من برای بهتر شدن براش یک کلاس نوشتم که هر جا خواستم یه شی میسازم و توابعش رو اجرا میکنم

public class AlarmController {

private Context m_Context;
private AlarmManager mgr;
private static final long PERIOD = 60000 * 30 * 1;

public AlarmController(Context context){

m_Context = context;
mgr = (AlarmManager)m_Context.getSystemService(Context.A LARM_SERVICE);
}

public void StartAlarm(){

StopAlarm();

Intent i = new Intent(m_Context, OnAlarmReceiver.class);
PendingIntent pi=PendingIntent.getBroadcast(m_Context, 0,i, PendingIntent.FLAG_UPDATE_CURRENT);
mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAK EUP,SystemClock.elapsedRealtime(),PERIOD,pi);

Log.i("AlarmController", "StartAlarm");
}

public void StopAlarm(){
Intent i = new Intent(m_Context, OnAlarmReceiver.class);
PendingIntent pi=PendingIntent.getBroadcast(m_Context, 0,i, PendingIntent.FLAG_UPDATE_CURRENT);
mgr.cancel(pi);

Log.i("AlarmController", "StopAlarm");
}
}

حالا هر جا خواستی یه شی از این بساز و تابع مورد نظرش رو اجرا کن.مقدار عددی بالا هم زمان تکراره که شما خودت برای نیازت تغییر بده.

البته اگه میخوایی با خاموش شدن و دوباره روشن شدن گوشی کار کنه این کلاس OnBootReceiver رو هم باید نویسی :

public class OnBootReceiver extends BroadcastReceiver {

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


AlarmController alarm = new AlarmController(context);
alarm.StartAlarm();
}
}


حالا این موارد بالا رو توی مانیفست باید تعریف کنی :

<receiver android:name="OnAlarmReceiver" > </receiver>
<receiver
android:name="OnBootReceiver"
android:enabled="true" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>


<service android:name="AppService" >
</service>

در نهایت پرمیشن بوت رو یادت نره بدی

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

gilas1368
چهارشنبه 16 مهر 1393, 19:26 عصر
ببین دوست عزیز بلد نبودن عیب نیست.

خوب به این صورت که میگم برو جلو.

اول یه کلاس درست میکنی به اسم OnAlarmReceiver : که هر بار از این طریق متوجه میشی که الارم وقتش شده و توی این کلاس سرویس مورد نظر رو فراخوانی میکنی.

public class OnAlarmReceiver extends BroadcastReceiver { @Override
public void onReceive(Context context, Intent intent) {
context.startService(new Intent(context, AppService.class));
}
}

حالا یه کلاس سرویس به اسم AppService هم مینویسی و مثلا اون کاری که میخوایی انجام بشه رو توی مینویسی مثلا من پیام توی سرور رو چک میکنم

public class AppService extends Service {

private static String TAG = "AppService";

@Override
public IBinder onBind(Intent intent) {
return null;
}


@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG, "start job");
ChechMessage();
Log.i(TAG, "stop job");
return START_STICKY;
}


}

خوب تا الان راه رو رفتی جلو حالا باید آلارم رو راه بندازی اونم به این صورت ،البته من برای بهتر شدن براش یک کلاس نوشتم که هر جا خواستم یه شی میسازم و توابعش رو اجرا میکنم

public class AlarmController {

private Context m_Context;
private AlarmManager mgr;
private static final long PERIOD = 60000 * 30 * 1;

public AlarmController(Context context){

m_Context = context;
mgr = (AlarmManager)m_Context.getSystemService(Context.A LARM_SERVICE);
}

public void StartAlarm(){

StopAlarm();

Intent i = new Intent(m_Context, OnAlarmReceiver.class);
PendingIntent pi=PendingIntent.getBroadcast(m_Context, 0,i, PendingIntent.FLAG_UPDATE_CURRENT);
mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAK EUP,SystemClock.elapsedRealtime(),PERIOD,pi);

Log.i("AlarmController", "StartAlarm");
}

public void StopAlarm(){
Intent i = new Intent(m_Context, OnAlarmReceiver.class);
PendingIntent pi=PendingIntent.getBroadcast(m_Context, 0,i, PendingIntent.FLAG_UPDATE_CURRENT);
mgr.cancel(pi);

Log.i("AlarmController", "StopAlarm");
}
}

حالا هر جا خواستی یه شی از این بساز و تابع مورد نظرش رو اجرا کن.مقدار عددی بالا هم زمان تکراره که شما خودت برای نیازت تغییر بده.

البته اگه میخوایی با خاموش شدن و دوباره روشن شدن گوشی کار کنه این کلاس OnBootReceiver رو هم باید نویسی :

public class OnBootReceiver extends BroadcastReceiver {

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


AlarmController alarm = new AlarmController(context);
alarm.StartAlarm();
}
}


حالا این موارد بالا رو توی مانیفست باید تعریف کنی :

<receiver android:name="OnAlarmReceiver" > </receiver>
<receiver
android:name="OnBootReceiver"
android:enabled="true" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>


<service android:name="AppService" >
</service>

در نهایت پرمیشن بوت رو یادت نره بدی

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

میشه خاهش کنم بطور کامل در مورد مقادیر برگشتی ای ک داخل تابع onStartCommand برمیگرده مثه همین START_STICKY ی توضیح بدید

ممنونم

reza_web
چهارشنبه 24 دی 1393, 12:34 عصر
اين كد وقتي كه برنامهما كاملا بسته باشد هم اجرا مي گردد؟

gilas1368
چهارشنبه 24 دی 1393, 12:38 عصر
بله اجرا میشه

reza_web
پنج شنبه 30 بهمن 1393, 12:10 عصر
اين كدها كه نوشته ايد را كجا بنويسيم؟؟
داخل اكتيويتي اصلي؟
داخل OnCreate يا خارج از آن
يا در يك فايل جاوا جداگانه؟؟

gilas1368
پنج شنبه 30 بهمن 1393, 12:15 عصر
محل نوشتن کدها مشخصه

reza_web
پنج شنبه 30 بهمن 1393, 12:33 عصر
ممنون
حالا ميشه يك بار توضيح دهيد كه جاي هر كد دقيقا كجاست؟؟؟
ممنون

reza_web
جمعه 01 اسفند 1393, 19:10 عصر
یعنی راهنمایی کردن بقیه اینقدر کار سختیه؟؟؟؟

Javad-ht
جمعه 13 شهریور 1394, 15:16 عصر
سلام
من میخوام برنامه ام هر شب ساعت 10 یه نوتیفیکیشن نشون بده.
طبق پست دوم پیش رفتم ولی مشکل اینجاست که هر نیم ساعت تکرار میکنه نوتیف رو در صورتی که من 2 راه مختلف رفتم که پایین میزارم و بر اساس اینا باید روزی یک بار بزاره!

این کاریه که تو appservice به جای checkmessage پست دوم گذاشتم.

Uri uri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE _NOTIFICATION);

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_launcher) // notification icon
.setContentTitle("Title") // title for notification
.setContentText("Content") // message for notification
.setAutoCancel(true)
.setSound(uri); // clear notification after click


Intent intentt = new Intent(this, MainActivity.class);
PendingIntent pi = PendingIntent.getActivity(this,0,intentt,Intent.FL AG_ACTIVITY_CLEAR_TOP);
mBuilder.setContentIntent(pi);
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(0, mBuilder.build());



تغییر بعدیم نسبت به پست دوم متد StartAlarm کلاس AlarmController بود.
اول چون میخواستم سر ساعت 10 شب نمایش بده به این صورت تغییرش دادم.


Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis( ));
calendar.set(Calendar.HOUR_OF_DAY, 22);
calendar.set(Calendar.MINUTE, 00);
mgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),PERIOD,pi);


بعد دیدم به جای هر 86400 ثانیه که میشه یک روز هر تقریبا یک ساعت تکرار میشه.
رفتم سایت دولوپر گوگل که برای اینکار کد زیر رو پیشنهاد داده بود.


Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis( ));
calendar.set(Calendar.HOUR_OF_DAY, 15);
calendar.set(Calendar.MINUTE, 05);
mgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
AlarmManager.INTERVAL_DAY, pi);


دقیقا نوشته اگه میخواید هر روز سر ساعت مشخص آلارم منیجر کار کنه این کد رو بزنید.ولی با این کد هم هر نیم ساعت نوتیف میاد بعد از اولین نوتیف که اینجا ساعت 15:05 هست!

حالا اینم بگم من تو تنها اکتیویتی برنامه تو onCreate برای اولین بار ازش یه شی میسازم و startAlarm رو استفاده میکنم.
گفتم شاید مشکل از اینه که هر بار وارد برنامه میشه این متد صدا زده میشه.
پس کد زیر رو نوشتم که فقط وقتی اولین بار برنامه نصب میشه اجرا بشه.چون دفعات بعد هم اگه ریست بشه از توی کلاس onBootReciver صدا زده میشه.

SharedPreferences wmbPreference = PreferenceManager.getDefaultSharedPreferences(this ); boolean isFirstRun = wmbPreference.getBoolean("FIRSTRUN", true);
if (isFirstRun)
{
AlarmController alarm = new AlarmController(this);
alarm.StartAlarm();
SharedPreferences.Editor editor = wmbPreference.edit();
editor.putBoolean("FIRSTRUN", false);
editor.commit();
}

ولی باز هم مشکل حل نشد که نشد.
یه تیکه کوچیک واقعا خسته ام کرده.
بقیه برنامه دقیقا مشابه پست دوست عزیزمونه!
ممنون میشم اگه راهنمایی کنید.

Javad-ht
دوشنبه 16 شهریور 1394, 18:59 عصر
صرفا جهت اینکه اگه کسی به مشکل مشابه خورد.
توی سرویس return start_sticky رو به return START_NOT_STICKY; تغییر دادم و مشکل حل شد!