انجمن سایت کلیدستان



مشکل در ایجاد تایمر برای انجام یک کار در تاریخ و ساعت مشخص (برنامه نویسی اندروید)زمان کنونی: ۱۳۹۵/۰۹/۱۳، ۱۲:۳۰ ق.ظ
کاربران در حال بازدید این موضوع: 1 مهمان
نویسنده: msh
آخرین ارسال: msh
پاسخ 15
بازدید 973

رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
مشکل در ایجاد تایمر برای انجام یک کار در تاریخ و ساعت مشخص (برنامه نویسی اندروید)

مشکل در ایجاد تایمر برای انجام یک کار در تاریخ و ساعت مشخص (برنامه نویسی اندروید)

#1
با سلام.
من میخوام که برنامه در یک تاریخ و ساعت مشخص کاری را انجام بدهد.

کلیدهای 2981 و 2983 رو خوندم و از اونها برای ایجاد یک تایمر استفاده کردم و کد زیر را نوشتم:

کد پی‌اچ‌پی:
        long mili_time System.currentTimeMillis(); 
 
       long Current_time mili_time 1000L   //   زمان فعلی به ثانیه

 
       long Goal_time componentTimeToTimestamp(201622900);   // زمان هدف به ثانیه

 
       long remind Goal_time Current_time   // زمان باقیمانده برای سپری شدن به ثانیه 

این هم که تابع  componentTimeToTimestamp :

کد پی‌اچ‌پی:
long componentTimeToTimestamp(int yearint monthint dayint hourint minuteint second)
{

 
   Calendar c Calendar.getInstance();
 
   c.set(Calendar.YEARyear);
 
   c.set(Calendar.MONTHmonth);
 
   c.set(Calendar.DAY_OF_MONTHday);
 
   c.set(Calendar.HOURhour);
 
   c.set(Calendar.MINUTEminute);
 
   c.set(Calendar.SECONDsecond);
 
   c.set(Calendar.MILLISECOND0);

 
   return (long) (c.getTimeInMillis() / 1000L);



در این مثال قرار هست که حدود 4 روز دیگر این تایمر کاری را انجام بدهد.
اما مقدار Remind عددی بیش از این را نشان میدهد(برای این مثال حدود 2948829 ثانیه) یعنی حدود 34 روز دیگر.

به نظر شما مشکل کجاست؟؟

باتشکر
پاسخ

مشکل در ایجاد تایمر برای انجام یک کار در تاریخ و ساعت مشخص (برنامه نویسی اندروید)

#2
به نظر من نمیدونم چرا در مستندات به این صورت نوشته شده .واقعا واسه من خیلی سوال هست. ایندکس ماه از 0 هست تا 11 !!! یعنی شما میخواید ماه دوم بزارید باید عدد 1 رو بزارید.این مشکل توی یک زمانی واقعا بنده رو اذیت کرد.
امیدوارم شما دیگه این نکته رو همیشه یادتون باشه
پاسخ
 سپاس شده توسط msh ، admin ، mahdi10539

مشکل در ایجاد تایمر برای انجام یک کار در تاریخ و ساعت مشخص (برنامه نویسی اندروید)

#3
(۱۳۹۴/۱۱/۰۸, ۰۷:۴۶ ب.ظ)داش بهروز نوشته: به نظر من نمیدونم چرا در مستندات به این صورت نوشته شده .واقعا واسه من خیلی سوال هست. ایندکس ماه از 0 هست تا 11 !!! یعنی شما میخواید ماه دوم بزارید باید عدد 1 رو بزارید.این مشکل توی یک زمانی واقعا بنده رو اذیت کرد.
امیدوارم شما دیگه این نکته رو همیشه یادتون باشه


ممنون از پاسخ درست شما. حل شد.

اما یک مطلب دیگه :


برای انجام کار در لحظه مد نظر از Reciver استفاده کردم که جواب میدهد اما اگر گوشی ریست یا خاموش / روشن شود  reciver  از بین میرود.
حتی در حالتی که صفحه گوشی lock میشه باز هم reciver جواب نمیده تا زمانیکه صفحه گوشی  رو باز کنی و داخل برنامه بشی.

برای این امر باید چه کنم؟


باتشکر
پاسخ

مشکل در ایجاد تایمر برای انجام یک کار در تاریخ و ساعت مشخص (برنامه نویسی اندروید)

#4
یک BroadcastReceiver تعریف کن .و کد ست کردن آلارم رو داخلش قرار بده ،که زمانی که گوشی ریستارت شد،و دوباره اجرا شد ،تنظیمات آلارم دوباره ست بشه و ازبین نره.
مثلا یک کلاس تعریف کن به نام My_reciver  بعدش ارث بری کنه این کلاس از BroadcastReceiver

فقط یادت نره که داخل منیفست خط زیر اضافه کنی


کد پی‌اچ‌پی:
<receiver android:name="My_Reciver" >
 
           <intent-filter>
 
               <action android:name="android.intent.action.BOOT_COMPLETED" />
 
         
            
</intent-filter>
 
       </receiver
پاسخ
 سپاس شده توسط msh ، admin

مشکل در ایجاد تایمر برای انجام یک کار در تاریخ و ساعت مشخص (برنامه نویسی اندروید)

#5
(۱۳۹۴/۱۱/۰۸, ۰۸:۴۷ ب.ظ)داش بهروز نوشته: یک BroadcastReceiver تعریف کن .و کد ست کردن آلارم رو داخلش قرار بده ،که زمانی که گوشی ریستارت شد،و دوباره اجرا شد ،تنظیمات آلارم دوباره ست بشه و ازبین نره.
مثلا یک کلاس تعریف کن به نام My_reciver  بعدش ارث بری کنه این کلاس از BroadcastReceiver

فقط یادت نره که داخل منیفست خط زیر اضافه کنی


کد پی‌اچ‌پی:
<receiver android:name="My_Reciver" >
 
           <intent-filter>
 
               <action android:name="android.intent.action.BOOT_COMPLETED" />
 
         
            
</intent-filter>
 
       </receiver





یعنی جدا از اون رسیوری که الان برای ست کردن الارم نوشتم، یک رسیور دیگه ست کنم؟
خب از کجا میفهمه که بعد ریست شدن باید بیاد بره تو کلاس ست مجدد؟
پاسخ

مشکل در ایجاد تایمر برای انجام یک کار در تاریخ و ساعت مشخص (برنامه نویسی اندروید)

#6
ببینید رسیور در واقع یه جورایی گوش به زنگ هست. یعنی مثلا وقتی گوشی عمل خاصی انجام داد اون رسیور واکنش نشون بده.
حالا وقتی شما داخل رسیور تون نوشتید

کد پی‌اچ‌پی:
<action android:name="android.intent.action.BOOT_COMPLETED" /> 

در واقع شما میگید هر دفعه عمل بوت انجام شد .این رسیور شروع به کار کن.وقتی شما کد ست کردن آلارم داخل این رسیور بزارید.به این معنی هست که وقتی گوشی ریستارت شد.میاد آلارم دوباره ست میکنه.
منظورتون از رسیور جدا نفهمیدم
پاسخ
 سپاس شده توسط msh ، admin

مشکل در ایجاد تایمر برای انجام یک کار در تاریخ و ساعت مشخص (برنامه نویسی اندروید)

#7
بله متوجه شدم و اینکار را انجام دادم اما متاسفانه پس از ریست الارم نمیده.

باضافه اینکه در بحث lock شدن گوشی(وقتی صفحه گوشی خاموشه) بایدباید راه دیگه ای وجود داشته باشه. درسته؟
پاسخ

مشکل در ایجاد تایمر برای انجام یک کار در تاریخ و ساعت مشخص (برنامه نویسی اندروید)

#8
نقل قول:باضافه اینکه در بحث lock شدن گوشی(وقتی صفحه گوشی خاموشه) بایدباید راه دیگه ای وجود داشته باشه. درسته؟

این مشکل را با اضافه کردم مجوز

کد پی‌اچ‌پی:
   <uses-permission android:name="android.permission.WAKE_LOCK"/> 

حل کردم.


فقط مشکل فعلی همان بحث ریست و عمل نکردن رسیور هست..
مواردی که گفته شد را اضافه کردم ولی باز هم پس از ریست شدن در بخش manage app رسیور فعال نیست و آلارم داده نمیشه ، مگر اینکه مجدد وارد برنامه شم.
پاسخ

مشکل در ایجاد تایمر برای انجام یک کار در تاریخ و ساعت مشخص (برنامه نویسی اندروید)

#9
سلام

این Permission رو هم به androidManifest اضافه کردید؟

کد:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
پاسخ

مشکل در ایجاد تایمر برای انجام یک کار در تاریخ و ساعت مشخص (برنامه نویسی اندروید)

#10
سلام

بله ولی جواب نمیدهد.

مجوزها

کد پی‌اچ‌پی:
<uses-permission android:name="com.android.alarm.permission.SET_ALARM"/>
 
   <uses-permission android:name="android.permission.WAKE_LOCK"/>
 
   <uses-permission android:name="android.permision.RECEIVE_BOOT_COMPLETED"/> 



کد پی‌اچ‌پی:
 <receiver
            android
:name="MyBroadcastReceiver"
 
           android:enabled="true"
 
           android:exported="false"
 
           android:permission="android.permission.RECEIVE_BOOT_COMPLETED" >
 
           <intent-filter>
 
               <action android:name="android.intent.action.BOOT_COMPLETED" />
 
           </intent-filter>
 
       </receiver


این هم کد آلارم :

کد پی‌اچ‌پی:
 Intent intent = new Intent(thisMyBroadcastReceiver.class);
 
       PendingIntent pendingIntent PendingIntent.getBroadcast(this.getApplicationContext(), 234324243intent0);
 
       AlarmManager alarmManager = (AlarmManagergetSystemService(ALARM_SERVICE);
 
       alarmManager.set(AlarmManager.RTC_WAKEUPSystem.currentTimeMillis() + (remind 1000), pendingIntent); 
پاسخ

مشکل در ایجاد تایمر برای انجام یک کار در تاریخ و ساعت مشخص (برنامه نویسی اندروید)

#11
البته اگه از گوشی های htc استفاده میکنید
باید ّFilter زیر رو هم Receiver اضافه کنید

کد:
<action android:name="android.intent.action.QUICKBOOT_POWERON"/>
پاسخ
 سپاس شده توسط داش بهروز ، msh ، admin

مشکل در ایجاد تایمر برای انجام یک کار در تاریخ و ساعت مشخص (برنامه نویسی اندروید)

#12
همون طور که دوستمون گفت شما باید از هردو اکشن برای رسیور استفاده کنید.

کد پی‌اچ‌پی:
<receiver android:name="BootReciver" >
 
           <intent-filter>
 
               <action android:name="android.intent.action.BOOT_COMPLETED" />
 
               <action android:name="android.intent.action.QUICKBOOT_POWERON" />
 
           </intent-filter>
 
       </receiver

برخی از مدلهای گوشی به این صورت هست.
 در واقع  2 عمل بوت کردن میتونه اتفاق بیوفته.یکی که بوت کامل صورت میگیره بیشتر زمانی هست که باتری گوشی تموم بشه و یا گوشی برای مدت زیادی خاموش بشه و..... ولی وقتی شما گوشی خاموش روشن میکنی ،fastBoot اتفاق میوفته ، که در این صورت شما باید اکشن مربوط به این عمل رو به رسیورتون بدید.
با قطعه کد بالا باید آلارم شما انجام بشه. اگه کار نکرد ،مطمئن بشید که اجازه دسترسی ست کردن آلارم در فایل منیفست قرار دادید. یا قطعه کدتون مشکل داره.
پاسخ
 سپاس شده توسط msh ، admin

مشکل در ایجاد تایمر برای انجام یک کار در تاریخ و ساعت مشخص (برنامه نویسی اندروید)

#13
اگه هنوز جواب نگرفتید بیاید از این سناریو استفاده کنید

یک کلاس جدید بسازید که از Service. Extend بشه و یک سرویس رو بسازید

در کلاس BroadCastReceiver بجای فعال کردن AlarmManager بیاید و Service جدید و start کنید
که در واقع سرویس بیاد و کارای مربوط به AlarmManager رو برای شما انجام بده

کدهای مربوط به MyBroadCastReceiver 

کد:
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.PowerManager;
import android.widget.Toast;


public class MyBroadCastReceiver extends BroadcastReceiver{

   @Override
   public void onReceive(Context context, Intent intent)
   {
       PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
       PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
       wl.acquire();

       // Put here YOUR code.
       Toast.makeText(context, "Alarm !!!!!!!!!!", Toast.LENGTH_LONG).show(); // For example
       SetAlarm(context);

       wl.release();
   }

   public void SetAlarm(Context context)
   {
       AlarmManager am =( AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
       Intent i = new Intent(context, MyBroadCastReceiver.class);
       PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
       am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 10, pi); // Millisec * Second * Minute
   }

}

کدهای مربوط به MyService

کد:
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;


public class Myservice extends Service {

   MyBroadCastReceiver myBroadCastReceiver = new MyBroadCastReceiver();

   public void onCreate() {
       super.onCreate();
   }

   @Override
   public int onStartCommand(Intent intent, int flags, int startId) {
       myBroadCastReceiver.SetAlarm(this);
       return START_STICKY;
   }

   @Override
   public void onStart(Intent intent, int startId) {
       myBroadCastReceiver.SetAlarm(this);
   }

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

کدهای فایل AndroidManifest

کد:
<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.example.mahdi.alarmmanager"
         xmlns:android="http://schemas.android.com/apk/res/android">

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


   <application
       android:allowBackup="true"
       android:icon="@mipmap/ic_launcher"
       android:label="@string/app_name"
       android:supportsRtl="true"
       android:theme="@style/AppTheme">

       <receiver android:name=".MyBroadCastReceiver"
           android:enabled="true"
           android:exported="false">
           <intent-filter>
               <action android:name="android.intent.action.BOOT_COMPLETED"/>
           </intent-filter>
       </receiver>

       <service android:name=".Myservice"
           android:enabled="true">

       </service>
       <activity android:name=".MainActivity">
           <intent-filter>
               <action android:name="android.intent.action.MAIN"/>

               <category android:name="android.intent.category.LAUNCHER"/>
           </intent-filter>
       </activity>
   </application>

</manifest>

با این روش بدون نیاز به اجرای برنامه . دقیقا بعد از Boot شدن device پیغام آلارم داده میشه و دوباره تنظیم میشه برای آلارم بعدی.
BroadCastReceiver و Service هر دو فعال هستند.
Alarm  برو روی 10 ثانیه تنظیم شده.
پاسخ
 سپاس شده توسط msh ، admin

مشکل در ایجاد تایمر برای انجام یک کار در تاریخ و ساعت مشخص (برنامه نویسی اندروید)

#14
سلام

باتشکر از پاسخ هر دو دوست عزیز، بله با اضافه کردن permission گفته شده آلارم کار کرد. روش استفاده از سرویس هم کار کرد.

تنها یک مسئله اون هم اینکه در هر دو حالت بعد از  ریست شدن، آلارم مجدد ست میشه + علاوه بر اون تمام کد های لحظه آلارم رو هم یکمرتبه همونجا انجام میده.

البته که سر موعود مقرر هم الارم میده اما مشکل این هست که چرا پس از ریست فقط آلارم ست نمیشه؟

من کدها رو به این فرم در آوردم تا تفاوت قائل شه اما باز هم نشد :

کد پی‌اچ‌پی:
    @Override
    
public void onReceive(Context contextIntent intent)
    {
        if (
"android.intent.action.BOOT_COMPLETED".equals(intent.getAction()))
        {
            
Toast.makeText(context"آلارم مجدد ست شد",    Toast.LENGTH_LONG).show();
            
SetAlarm(context);
        }
        else
        {
            
Toast.makeText(context,"Alaaaaaaarm!!!!",    Toast.LENGTH_LONG).show();
            
Vibrator vibrator = (Vibratorcontext.getSystemService(Context.VIBRATOR_SERVICE);
            
vibrator.vibrate(500);
        }
    } 
پاسخ

مشکل در ایجاد تایمر برای انجام یک کار در تاریخ و ساعت مشخص (برنامه نویسی اندروید)

#15
Smile 
متوجه مشکل شدم. به نظرم از مشکل از نوع ست کردن آلارم بود که alarmmanager.setRepeating و به alarmmanager.set تغییر دادم و مشکل حل شد.


با تشکر از راهنمایی های خوب شما
پاسخ
 سپاس شده توسط admin


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان

آخرین کلیدهای غیررایگان

شما هم می توانید کلیدهای غیررایگان منتشر کنید (بیشتر بدانید)