ورود

View Full Version : ارسال و دریافت خودکار اطلاعات



AliRezaBeytari
پنج شنبه 07 خرداد 1394, 17:27 عصر
سلام دوستان.
نمیدونم این موضوع چقدر در انجمن بحث شده ؛ اما اگر زیاد بحث شده ، به بزرگی خودتون ببخشید !! :لبخندساده:

من درون برنامم میخوام با سرور ارتباط برقرار کنم.
میخوام اینطوری باشه که ، مثلا هر وقت درون از طرف سرور دستوری رو به app ارسال کردم ، بلافاصله تمام دستگاه هایی که برنامه من روشون نصب هست (چه برنامه باز باشه و چه بسته) اون دستور رو دریافت کنند.
نمیخوام اینطوری باشه که مثلا هر 10 دقیقه یک بار چک کنم که از سرور دستوری ارسال شده یا نه. و همچنین نمیخوام از سیستم هایی مثل Parse برای اینکار استفاده کنم.
میخوام یه ارتباط متقابل بین سرور و app باشه که بدون نیاز به سایت یا سرور دیگه کار خودش رو انجام بده !!!

خیلی ممنون میشم راهنمایی کنید.

pbm_soy
جمعه 08 خرداد 1394, 02:14 صبح
شما اگر نمیخواید خودتون رفرش کنید و یا نمیخواید از روش پارس ویا گوگل استفاده کنیدفقط یک حالت باقی میماند آنهم این است که سرور مستقیما پیام را به کلاینتها بفرستد که لازمه اش این است که کلاینتها از اینترنت قابل دید باشندمثلا کلاینتها با استفاده از سوکت پروگرامینگ یک کانکشن با سرور ایجاد کنند و آنرا باز نگهدارند تا هر وقت سرور دوست داشت پیامی را ارسال کند
توجه داشته باشید که این کانکشن باید تا آخر کار باز بماند چون فقط کلاینتها هستند که این کانکشن را برقرار میکنند برعکس قضیه امکان پذیر نخواهد بود یعنی هروقت سرور دلش خواست با کلاینتها یک سوکت باز کند!
البته باید بگم که سرور هم میتواند کانکشن برقرار کند به شرطی که کلاینتهای شما ای پی آدرس ولید داشته باشند ولی دربیشتر مواقع دستگاههاي اندرویدی با ای پی آدرس غیر ولید به اینترنت وصل میشوند وبه اصطلاح میگن دستگاه پشت nat است
به عنوان مثال اگه از طریق وای فای وصل بشن ای پی غیر ولید است و حتی اینترنت سیم کارتهای همراه اول و ایرانسل هم ای پی غیر ولید میدن در حال حاضر فقط سیم کارت رایتل ای پی ولید میدهد!

بطور خلاصه شما مجبورید سوکت پروگرامینگ کنید

pbm_soy
جمعه 08 خرداد 1394, 02:23 صبح
یک مورد دیگر یادم رفته بگم اونم اینه که ایجاد کانکشن از سمت سرور با کلاینتهای بدون ای پی ولید با روشها و الگوریتمهای nat traversal امکان پذیر است که مجبورید یا از apiهایی که این روشها را پیاده سازی کردن استفاده کنید ویا خودتون آنها را پیاده سازی کنید
چند نمونه از این روشها:
Cling
Tcp punching hole
Udp punching hole
Stun
وچند روش دیگر بهتراست nat traversal را مطالعه کنید
البته روش راحت شما اينه که کلاینتها کانکشن بزنند به سرور و آنرا باز نگهدارند تا پایان کار ودر سرور آن کانکنکشنها را مدیریت کنید و هر وقت نیاز داشتید به یک یا چند تا از آنها پیام ارسال کنید

JYasProgramer
جمعه 08 خرداد 1394, 08:15 صبح
خب pbm_soy (http://barnamenevis.org/member.php?20034-pbm_soy) طبق توضیحات شما این به کار بیشتر نیاز نداره و حجم برنامه بالاتر نمیره و آیا cpu یا ram توی اینجور موارد بیشتر درگیرنیست؟

djtrex
جمعه 08 خرداد 1394, 12:47 عصر
میتونید یه Sticky Service بسازید بعد application:persistent رو توی manifest هم true کنید که اندروید kill نکنه اپ رو. توی سرویستون هم با websocket به سرور متصل باشید.
ولی خوب چیزی از باتری نمیمونه اینجوری!!

راه های دیگه هم که خودتون اشاره کردید:
pulling:
با sync adapter یا alarm manager

روش push notification که با GCM گوگل فرستاده می شه و parse فقط کار رو راحت میکنه (خودتون هم میتونید پیاده کنید! +‌ مشابه parse هم زیاده!)

روشی هم که دوست دیگه گفتن که توی گوشی های اندروید بهینه نیست +‌ پیچیدگی زیادی داره.


برای websocket هم نیاز نیست سمت سرور کد پیچیده ای بزنید میتونید از سرویس های مثل realtime framework - pubnub - pusher و ... استفاده کنید. این سرویس همچنین اجازه میدن موقعی که اپ رو باز میکنید با وب سوکت به سرور وصل باشید موقعی هم اپ بسته باشه با gcm پیام رو بگیره. عملا کار رو راحت میکنه برای شما. (در صورت تمایل البته!)‌

AliRezaBeytari
جمعه 08 خرداد 1394, 12:53 عصر
اول به خاطر پاسختون خیلی ممنونم. :قلب:
نمیدونم این روشی که گفتید چقد سخته و چقدر امنه ؛ اما فکر کنم راه سختی باشه.
من خودم به یه روش فکر میکنم ، اما نمیدونم این روش خوب هست یا نه :

من میگم ، مثلا یه سرویس درست کنم برای app و درون اون سرویس کدی بنویسم (نمیدونم میشه یا نه و کدش رو هم نمیدونم) که هر وقت کاربر به اینترنت متصل شد ، بلافاصله برنامه من متوجه بشه و سرور رو چک کنه. دقت کنید ، من نمیخوام هی درخواست بدم ببینم کاربر به اینترنت متصل هست یا نه که اگر متصل بود به سرور درخواست بدم. میخوام طوری باشه که هر وقت کاربر به اینترنت متصل شد به برنامه من اطلاع داده بشه و برنامه من بره از سرور چک کنه.

مشکل من اینه که ، نه میدونم چطور میتونم یه سرویس بنویسم تا در پست زمینه و هنگامی که برنامه من بسته شده کار بکنه ؛ و نه میدونم چطور میتونم اون بخشی که رنگ آبی داره رو چطور بنویسم !!!

ممنون میشم درباره این دو موضوع راهنمایی کنید.

djtrex
جمعه 08 خرداد 1394, 13:06 عصر
اول به خاطر پاسختون خیلی ممنونم. :قلب:
نمیدونم این روشی که گفتید چقد سخته و چقدر امنه ؛ اما فکر کنم راه سختی باشه.
من خودم به یه روش فکر میکنم ، اما نمیدونم این روش خوب هست یا نه :

من میگم ، مثلا یه سرویس درست کنم برای app و درون اون سرویس کدی بنویسم (نمیدونم میشه یا نه و کدش رو هم نمیدونم) که هر وقت کاربر به اینترنت متصل شد ، بلافاصله برنامه من متوجه بشه و سرور رو چک کنه. دقت کنید ، من نمیخوام هی درخواست بدم ببینم کاربر به اینترنت متصل هست یا نه که اگر متصل بود به سرور درخواست بدم. میخوام طوری باشه که هر وقت کاربر به اینترنت متصل شد به برنامه من اطلاع داده بشه و برنامه من بره از سرور چک کنه.

مشکل من اینه که ، نه میدونم چطور میتونم یه سرویس بنویسم تا در پست زمینه و هنگامی که برنامه من بسته شده کار بکنه ؛ و نه میدونم چطور میتونم اون بخشی که رنگ آبی داره رو چطور بنویسم !!!

ممنون میشم درباره این دو موضوع راهنمایی کنید.

اگه فقط نیاز به این دارید که موقع اتصال به اینترنت سرور رو چک کنه میتونید broadcast receiver برای اتصال به اینترنت ست کنید موقع وصل شدن به اینترنت اپ شمارو هم صدا میزنه که حالا میتونید یه سرویس هم اجرا کنید.
یا میتونید یه sync adapter تنظیم کنید هر موقع به اینترنت متصل شدید سرویستون رو صدا میزنه (sync adapter امکان این رو داره که تنظیم کنید هر چند ثانیه/دقیقه سرویس رو صدا بزنه)

برای broadcast receiver:
http://viralpatel.net/blogs/android-internet-connection-status-network-change/
http://stackoverflow.com/questions/25678216/android-internet-connectivity-change-listener

برای sync adapter:
https://developer.android.com/training/sync-adapters/index.html

در ضمن پیشنهاد گوگل استفاده از sync adapter هست :)

hamedg1366
جمعه 08 خرداد 1394, 13:11 عصر
سلام دوست عزیز

میشه درباره sync adapter یکم توضیح بیشتر برای کسانی که انگلیسیشئن خوب نیس بدین(در صورت امکان با مثال)



تشکر از شما بزرگوار

dalmif
جمعه 08 خرداد 1394, 13:14 عصر
سلام دوست عزیز.
ببینید توی برنامه نویسی اندروید یه چیزی داریم به نام broadcast receiver اینجوری کار میکنن که مثلا شما میگی هر وقت یه اس ام اس اومد خبرم کن.
بعد اندروید شما رو میزاره توی لیست خودش چه برنامه باز باشه چه بسته هر موقع پیام اومد برنامه شما فعال میشه.
حالا شما می تونی اینطوری بنویسی که هر وقت به اینترنت متصل شد کاری که شما می خواهید رو انجام بده


public class NetworkChangeReceiver extends BroadcastReceiver {


@Override
public void onReceive(final Context context, final Intent intent) {
final ConnectivityManager connMgr = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);


final android.net.NetworkInfo wifi = connMgr
.getNetworkInfo(ConnectivityManager.TYPE_WIFI);


final android.net.NetworkInfo mobile = connMgr
.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);


if (wifi.isAvailable() || mobile.isAvailable()) {
// Do something


Log.d("Netowk Available ", "Flag No 1");
}
}
}

در کد بالا وقتی به اینترنت متصل شد log میده.
توجه داشته باشید که پرمیشن های مورد نیاز رو بزارید. (پرمیشن اینترنت رو هم که همه بلدن اون رو هم اضافه کنید)


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


و برای شناسوندن بردکست ریسور به اندروید توی فایل منیفست کد زیر رو هم اضافه کنید.


<receiver android:name=".NetworkChangeReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
</intent-filter>
</receiver>

در کد های بالا اگه وای فای (یا اینترنت خود گوشی )خاموش یا روشن بشه به شما خبر میده
با کد زیر میتونید چک کنید که حالا اینترنت متصل هست یا نه


public boolean isOnline(Context context) {


ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERV ICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
//should check null because in air plan mode it will be null
return (netInfo != null && netInfo.isConnected());


}

تموم شد.
سوالی بود در خدمتم.
یا علی مدد

dalmif
جمعه 08 خرداد 1394, 13:15 عصر
ببخشید من جواب دوست عزیزمون
djtrex (http://barnamenevis.org/member.php?76555-djtrex) رو ندیدم :لبخندساده:

djtrex
جمعه 08 خرداد 1394, 14:55 عصر
سلام دوست عزیز

میشه درباره sync adapter یکم توضیح بیشتر برای کسانی که انگلیسیشئن خوب نیس بدین(در صورت امکان با مثال)



تشکر از شما بزرگوار

sync adapter شاید اولش به نظر پیچیده بیاد ولی وقتی یه بار ازش استفاده کنید کار باهاش راحته.
اول از همه بگم sync adapter برای مواقعی خوبه که شما نیاز ندارید به صورت real-time با سرور ارتباط داشته باشین یا دقیقا سر ساعت (alarm manager) یه کاری رو انجام بدین.

امکاناتی که sync adapter به شما میده:
- به شما گارانتی میده که وقتی اینترنت برقرار شد سرویس رو صدا میزنه
- میتونید در مواقع زیر یه سینک آداپتور رو اجرا کنید (با هم هم امکان پذیر هست)

وقتی اطلاعات سرور تغییر پیدا کرد و با gcm به کاربر پیام داده شد (push to sync)
وقتی اطلاعات دیوایس تغییر کرد (از طریق content provider مثل اپ جیمیل)
هر موقع ارتباط اینترنت برقرار شد
اجرا هر چند دقیقه/ساعت/ثانیه یا سر ساعت خاص (به دلیل اینکه اندروید تصمیم میگیره کی سرویس رو اجرا کنه ممکنه دقیقا اون زمان نباشه چند ثانیه یا چند دقیقه بالا پایین باشه!)
بر اساس درخواست برنامه نویس (مثلا هر موقع اپ باز شد این سرویس اجرا بشه)

- مدیریت بهینه رم و باتری چون خود اندروید تصمیم میگیره چه موقع سرویس رو اجرا کنه (فرض کنید رسیدید خونه و به اینترنت wifi وصل شدید و ۱۰ تا اپ دارید که broadcast receiver تنظیم کردن تا به محض ارتباط به اینترنت با سرور خودشون سینک بشن. خوب این ۱۰ تا اپ با هم اینکارو میکنند در نتیجه پهنای باند و حافظه بیشتری استفاده می کنند و اصلا بهینه نیست ولی با سینک آداپتور اندروید همه رو با هم اجرا نمی کنه اولویت بندی میکنه یه سری رو الان اجرا میکنه بقیه رو هم میفرسته توی یه صف که بعدا اجرا بشه )
- چون از اکانت منیجر استفاده میکنه میتونید فرآیند احراز هویت و دسترسی کاربر رو هم براحتی پیاده کنید (مثلا دریافت اکسس توکن جدید در پروتکل OAuth)
- استفاده از content provider برای مواقعی که اطلاعات دستگاه تغییر کرده و نیاز به سینک کردن با سرور هست (به صورت خودکار اندروید صدا میزنه اگه دیتای جدیدی باشه)
- امکان دادن کنترل به کاربر برای اینکه چه اطلاعاتی سینک شود (در اکانت منیجر - البته میتونید کاری کنید که اصلا در اکانت منیجر نمایش داده نشه و همیشه سینک بشه!)
- کاربر میتونه فرآیند سینک خودشو غیر فعال کنه تا باتری بیشتری داشته (البته موقع باز کردن اپ میتونید سرویس سینک رو اجرا کنید)






sync adapter شامل این اجزاست:
- یه bound service (که زمانی که زمانش برسه اجرا میشه)
- یه content provider ( که اختیاری هست. برای مواقعی که شما به صورت آفلاین یه سری اطلاعات جدید دارید و نیاز دارید هر موقع طرف آنلاین شد با سرور سینک بشه (مثل اپ جیمیل) به صورت اتوماتیک خود اندروید چک میکنه اطلاعات جدیدی هست اگه هست سرویس سینک آداپتور رو صدا میزنه)
- یه authenticator (که اختیاری هست. برای مواقعی هست که شما حساب کاربری برای کاربر دارید و نیاز دارید تا احراز هویت بشه (مثلا از طریق پروتکل OAuth نیاز دارید توکن بگیرید)
- یه کلاس sync که از AbstractThreadedSyncAdapter ارث بری میکنه و فرآیند انتقال و سینک با سرور رو انجام میده (این فرآیندهارو خودتون باید بنویسید)
- ۲ تا فایل xml یکی برای authenticator که توی account manager نشون میده میتونید براش آیکون یا تنظیمات در نظر بگیرید. یدونه هم مال sync adapter هست که میتونید مشخص کنید حجم زیادی میخواید آپلود کنید - به صورت موازی سینک بشه (حداقل ۲ تا سرویس بتونه با هم اجرا بشه برای مواقعی که طرف چندتا اکانت داره مثل جیمیل) و ...


permission هایی که نیاز دارید:


<manifest>
...
<uses-permission
android:name="android.permission.INTERNET"/>
<uses-permission
android:name="android.permission.READ_SYNC_SETTINGS"/>
<uses-permission
android:name="android.permission.WRITE_SYNC_SETTINGS"/>
<uses-permission
android:name="android.permission.AUTHENTICATE_ACCOUNTS"/>
...
</manifest>


هر موقع فرآیند سینک صدا زده میشه اندروید کاری به نحوه پیاده سازی و ارتباط با سرور نداره فقط متد onPerformSync رو صدا میزنه:


/*
* Specify the code you want to run in the sync adapter. The entire
* sync adapter runs in a background thread, so you don't have to set
* up your own background processing.
*/
@Override
public void onPerformSync(
Account account,
Bundle extras,
String authority,
ContentProviderClient provider,
SyncResult syncResult) {
/*
* Put the data transfer code here.
*/
...
}


فایل سمپل رو میتونید از اینجا دانلود کنید:
http://developer.android.com/shareables/training/BasicSyncAdapter.zip

آموزش های سایت اندروید رو هم میتونید اینجا ببینید جامع توضیح داده:
https://developer.android.com/training/sync-adapters/index.html

===============
با همه این تفاسیر باید ببینید به همچین چیزی نیاز دارید یا خیر!؟ اگه با روش ساده تر یا بهینه تری میتونید اینکارارو انجام بدید خوب از همون استفاده کنید:)

AliRezaBeytari
جمعه 08 خرداد 1394, 14:57 عصر
از همه دوستان که من رو راهنمایی کردم واقعا ممنونم.
جناب dalmif ، من با توجه به اون چیز هایی که گفته بودید ، یه پروژه درست کردم ؛ اما نمیدونم چرا Error میده و از برنامه خارج میشه !!

NetworkChangeReceiver.java

package com.alireza.broadcastreceivertest;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.widget.Toast;

public class NetworkChangeReceiver extends BroadcastReceiver {

@Override
public void onReceive(final Context context, final Intent intent) {
final ConnectivityManager connMgr = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);

final android.net.NetworkInfo wifi = connMgr
.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

final android.net.NetworkInfo mobile = connMgr
.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

if (wifi.isAvailable() || mobile.isAvailable()) {
if (isOnline(context)) {
Toast.makeText(context, "Network is available", Toast.LENGTH_SHORT).show();
}
}
}

public boolean isOnline(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERV ICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
return (netInfo != null && netInfo.isConnected());
}
}



AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.alireza.broadcastreceivertest" >

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

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

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

<receiver android:name=".NetworkChangeReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
</intent-filter>
</receiver>

</application>

</manifest>



این هم روند اجرا :

http://p30up.ir/images/0nlvdj4i7hcawcuhps2c.gif


این هم LogCat :


05-29 10:36:55.282 1233-1233/com.alireza.broadcastreceivertest E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start receiver com.alireza.broadcastreceivertest.NetworkChangeRec eiver: java.lang.NullPointerException
at android.app.ActivityThread.handleReceiver(Activity Thread.java:2236)
at android.app.ActivityThread.access$1500(ActivityThr ead.java:130)
at android.app.ActivityThread$H.handleMessage(Activit yThread.java:1271)
at android.os.Handler.dispatchMessage(Handler.java:99 )
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.jav a:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCa ller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit .java:553)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.alireza.broadcastreceivertest.NetworkChangeRec eiver.onReceive(NetworkChangeReceiver.java:23)
at android.app.ActivityThread.handleReceiver(Activity Thread.java:2229)
at android.app.ActivityThread.access$1500(ActivityThr ead.java:130)
at android.app.ActivityThread$H.handleMessage(Activit yThread.java:1271)
at android.os.Handler.dispatchMessage(Handler.java:99 )
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.jav a:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)



خیلی ممنونم.

djtrex
جمعه 08 خرداد 1394, 15:08 عصر
خط ۲۳ broadcast receiver مشکل داره احتمال مقدار wifi یا mobile نال هست.
قبلش چک کنید null هست یا نه یا توی یه try ... catch بذارید.

tux-world
جمعه 08 خرداد 1394, 16:41 عصر
sync adapter امکاناتی که sync adapter به شما میده:
- به شما گارانتی میده که وقتی اینترنت برقرار شد سرویس رو صدا میزنه
- میتونید در مواقع زیر یه سینک آداپتور رو اجرا کنید (با هم هم امکان پذیر هست)

وقتی اطلاعات سرور تغییر پیدا کرد و با gcm به کاربر پیام داده شد (push to sync)
وقتی اطلاعات دیوایس تغییر کرد (از طریق content provider مثل اپ جیمیل)
هر موقع ارتباط اینترنت برقرار شد
اجرا هر چند دقیقه/ساعت/ثانیه یا سر ساعت خاص (به دلیل اینکه اندروید تصمیم میگیره کی سرویس رو اجرا کنه ممکنه دقیقا اون زمان نباشه چند ثانیه یا چند دقیقه بالا پایین باشه!)
بر اساس درخواست برنامه نویس (مثلا هر موقع اپ باز شد این سرویس اجرا بشه)
داکیومنت خلاصه و بسیار مفیدی بود دستت درد نکنه. تا این حد بهش اهمیت نداده بودم ولی الان نه. :لبخندساده:

AliRezaBeytari
جمعه 08 خرداد 1394, 19:34 عصر
از همه دوستان برای کمک هایی که کردن خیلی ممنونم.
فقط یه سوال دیگه هم داشتم. من چطور میتونم این سرویس رو stop کنم ؟؟!؟!

dalmif
شنبه 09 خرداد 1394, 12:02 عصر
اگه با اسینک تسک کار می کنید که دیگه باید پاک کنید چون اندروید برنامه تون رو توی لیست قرار داده
اما اگه سرویس هست می تونید متوقفش کنید
برنامه تون رو بر روی گوشی اجرا کنید ببینید مشکل پیش میاد

atpf67
یک شنبه 10 خرداد 1394, 11:40 صبح
از همه دوستان برای کمک هایی که کردن خیلی ممنونم.
فقط یه سوال دیگه هم داشتم. من چطور میتونم این سرویس رو stop کنم ؟؟!؟!

سلام بزرگوار

برای متوقف کردن برودکست رسیور از کد زیر استفاده کنید:


public void disable(Context context) {
ComponentName receiver = new ComponentName(context, yourBroadcastReceiver.class);

PackageManager pm = context.getPackageManager();

pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
}

pbm_soy
دوشنبه 11 خرداد 1394, 02:34 صبح
میتونید یه Sticky Service بسازید بعد application:persistent رو توی manifest هم true کنید که اندروید kill نکنه اپ رو. توی سرویستون هم با websocket به سرور متصل باشید.
ولی خوب چیزی از باتری نمیمونه اینجوری!!

راه های دیگه هم که خودتون اشاره کردید:
pulling:
با sync adapter یا alarm manager

روش push notification که با GCM گوگل فرستاده می شه و parse فقط کار رو راحت میکنه (خودتون هم میتونید پیاده کنید! +‌ مشابه parse هم زیاده!)

روشی هم که دوست دیگه گفتن که توی گوشی های اندروید بهینه نیست +‌ پیچیدگی زیادی داره.


برای websocket هم نیاز نیست سمت سرور کد پیچیده ای بزنید میتونید از سرویس های مثل realtime framework - pubnub - pusher و ... استفاده کنید. این سرویس همچنین اجازه میدن موقعی که اپ رو باز میکنید با وب سوکت به سرور وصل باشید موقعی هم اپ بسته باشه با gcm پیام رو بگیره. عملا کار رو راحت میکنه برای شما. (در صورت تمایل البته!)‌


هدف دوستمون در پست اول این بود که برنامه منتظر یک رخداد از طرف سرور باشد و نمیخواست برنامه در فواصل زمانی خاص به سرور درخواست بفرسته و یا به قول خودشون رفرش بشه برای همین من اون جواب را دادم و حواسم به بحث WebSocket و WebRTC نبود!
آیا امکانش هست برای وصل ماندن به سرور را با وب سوکت مثال بزنید در واقع یک مثال برای وب سوکت میخواستم و یا اینکه یک منبع خوب و شسته روفته برای استفاده از وب سوکت در اندروید معرفی کنید

djtrex
دوشنبه 11 خرداد 1394, 14:20 عصر
هدف دوستمون در پست اول این بود که برنامه منتظر یک رخداد از طرف سرور باشد و نمیخواست برنامه در فواصل زمانی خاص به سرور درخواست بفرسته و یا به قول خودشون رفرش بشه برای همین من اون جواب را دادم و حواسم به بحث WebSocket و WebRTC نبود!
آیا امکانش هست برای وصل ماندن به سرور را با وب سوکت مثال بزنید در واقع یک مثال برای وب سوکت میخواستم و یا اینکه یک منبع خوب و شسته روفته برای استفاده از وب سوکت در اندروید معرفی کنید

درسته راهکاری های خوبی هست توی voip هم داره استفاده می شه ولی خوب برای تلفن های همراه که محدودیت منابع دارن خصوصا باتری بهینه نیست. الان SIP رو هم روی websocket میتونند پیاده کنند:
https://tools.ietf.org/html/rfc7118
http://jssip.net/

-----------------
اما برای وب سوکت

یه راهکار ساده تر اینه که از سرویس های مثل realtime framework - pubnub - pusher و ... استفاده کنید که خودش قسمت کانکت شدن سوکت ها و مدیریت اونها و ... رو انجام میده. و شما کافیه سمت سرور دیتایی که دارید رو روی channel ای که می خواید publish کنید.

خوشبختانه این سایت ها خصوصا pusher مستندات و کتابخانه ها و مثال های زیادی برای زبان های مختلف دارند:
https://pusher.com/
http://www.pubnub.com/products/publish-subscribe/
http://framework.realtime.co/messaging/

اکثر این سرویس ها از پروتکل WAMP استفاده می کنند که به صورت publish/subscribe هست یعنی یه سری channel هست که شما بهش مشترک می شید و دیتاهایی که می خواید توی این channel ها منتشر می کنید و مشترکین دریافت می کنند.

اما اگه میخواید سمت سرور خودتون سوکت هارو مدیریت کنید می تونید از کتاب خانه های زیر سمت سرور استفاده کنید:

برای PHP:
Ratchet:
http://socketo.me/

Workerman:
https://github.com/walkor/workerman

PushmanPHP:
https://github.com/PushmanPHP/pushman

Hoa websocket:
https://github.com/hoaproject/Websocket

و...

برای Node.Js:
socket.io:
http://socket.io/

premus:
https://github.com/primus/primus

ws
https://www.npmjs.com/package/ws

nodejs-websocket
https://www.npmjs.com/package/nodejs-websocket

chat.io
https://www.npmjs.com/package/chat.io

و...

زبان های دیگه کار نکردم ولی سرچ کنید پیدا میکنید:)

------
برای کلاینت هم مثل اندروید میتونید از کتاب خانه های زیر استفاده کنید:

Socket.io for Android:
http://socket.io/blog/native-socket-io-and-android/

AndroidAsync:
https://github.com/koush/AndroidAsync

Autobahn|Android
http://autobahn.ws/android/

nv-websocket-client
https://github.com/TakahikoKawasaki/nv-websocket-client

و ...

در سمت کلاینت مثل اندروید بهتر از یه EventBus استفاده کنید (برای مدیریت بهتر رویدادهایی که از سمت سرور push میشه)

Greenrobot EventBus
https://github.com/greenrobot/EventBus

Square Otto
http://square.github.io/otto/

=========
پروتکل wamp:
http://wamp.ws/

=========
این اسلاید ها هم توضیحات خوبی دادن در مورد راه اندازی یه اپلیکیشن real-time با اندروید و websocket:
http://www.slideshare.net/sergialmar/building-realtime-applications-with-android-and-websockets