آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

استفاده از BroadcastReceiver برای Push Notification

h_r_v  12 سال پیش  11 سال پیش
+2 0

این مبحث Push Notification عجیب منو مشغول کرده :دی! ببخشید هی سوال میکنم!

میخوام این کد هایی که ازشون برای ساختن Push Notification استفاده میکنم ، بعد از روشن شدن دستگاه هر 6 ساعت یکبار اجرا شن ( یعنی هر 6 ساعت یک بار یه ارتباط با سرور برقرار بشه ).. کدش رو میدید و یا راهش رو توضیح میدید؟ مبحث AlarmManager رو هم دیدم ولی خودم که تست میکنم نمیشه! همه ی این کد ها رو میبرم توی service بعد که سرور رو اجرا میکنم نه ناتیفیکیشن میاد نه برنامه :| خطا هم نمیده
PN.java

 package com.yekteam.flashlight;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.app.AlarmManager;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.NotificationCompat;
import android.util.Log;

public class PN extends Activity {
public static Context context;
public static C2D service;
public static SharedPreferences preferences;

@Override
protected void onCreate(Bundle savedInstanceState) {
context = getApplicationContext();
preferences = PreferenceManager.getDefaultSharedPreferences(context);
startPushNotification();
}
private void startPushNotification() {
service = new C2D()
.key("flashlight")
.url("http://c2d.yekteam.com/service.php")
.interval(1000)
// .network(C2D.NETWORK_ALWAYS)
.listener(new C2D.Listener() {

@Override
public void onDataReceive(String data) {
try {
SharedPreferences settings = getSharedPreferences("id", MODE_PRIVATE);
SharedPreferences.Editor prefEditor = settings.edit();
JSONObject object = new JSONObject(data);
String title = object.getString("title");
String title_first = object.getString("title_first");
String matn = object.getString("matn");
String link = object.getString("link");
Integer id = object.getInt("id");
int id2 = settings.getInt("id", 0);
Log.i("LOG", "ID2 is " + id2);
if (id2 != id){
prefEditor.putInt("id", id);
prefEditor.commit();
boolean status = object.getBoolean("status");
if (status == true){
Notification(title,matn,link,title_first);
}
else {}
}
} catch (JSONException e) {

e.printStackTrace();
}

}
}).start();
}
public void Notification(String title, String matn, String link, String title_first) {

Uri uri = Uri.parse("market://details?id=" + link);
Intent goToMarket = new Intent(Intent.ACTION_VIEW, uri);
Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
PendingIntent pIntent = PendingIntent.getActivity(this, 0, goToMarket,
PendingIntent.FLAG_UPDATE_CURRENT);

NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
.setSound(alarmSound)
.setSmallIcon(R.drawable.attention)
.setTicker(title_first)
.setContentTitle(title)
.setContentText(matn)
.setContentIntent(pIntent)
.setAutoCancel(true);

NotificationManager notificationmanager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationmanager.notify(0, builder.build());

}
}

C2D.java

 package com.yekteam.flashlight;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;


public class C2D {

public static final int PROTOCOL_EXCEPTION = -1;
public static final int IO_EXCEPTION = -2;
public static final int UNKNOWN_EXCEPTION = -3;

public static final int NETWORK_ALWAYS = 1;
public static final int NETWORK_JUST_WIFI = 2;


public static interface Listener {

public void onDataReceive(String data);
}

private Listener listener;
private String key;
private long interval;
private int network;
private String url;

private ArrayList<NameValuePair> inputArguments = new ArrayList<NameValuePair>();

private boolean enable = true;


public C2D listener(Listener value) {
listener = value;
return this;
}


public C2D interval(long value) {
interval = value;
return this;
}


public C2D network(int value) {
network = value;
return this;
}


public C2D url(String value) {
url = value;
return this;
}


public C2D key(String value) {
key = value;
return this;
}


public void disable() {
enable = false;
}


public void enable() {
if (enable) {
return;
}

enable = true;
start();
}


public C2D start() {
Thread thread = new Thread(new Runnable() {

@Override
public void run() {
while (enable) {
try {
check();
Thread.sleep(interval);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});

thread.start();
return this;
}


public void check() {
int status = readNetworkStatus();
if (status == DISCONNECTED) {
return;
}

if (network == NETWORK_JUST_WIFI && status == MOBILE) {
return;
}

Thread thread = new Thread(new Runnable() {

@Override
public void run() {
try {
HttpParams params = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(params, 1000);
HttpConnectionParams.setSoTimeout(params, 1000);
HttpClient client = new DefaultHttpClient(params);
HttpPost request = new HttpPost(url);
inputArguments.clear();
inputArguments.add(new BasicNameValuePair("key", key));
request.setEntity(new UrlEncodedFormEntity(inputArguments));
HttpResponse httpResponse = (HttpResponse) client.execute(request);
String data = streamToString(httpResponse.getEntity().getContent());
if (listener != null) {
listener.onDataReceive(data);
return;
}
}
catch (ClientProtocolException e) {}
catch (IOException e) {}
catch (Exception e) {}
}
});

thread.start();
}


private String streamToString(InputStream inputStream) {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder stringBuffer = new StringBuilder();

String line = null;
try {
while ((line = bufferedReader.readLine()) != null) {
stringBuffer.append((line + "\n"));
}
}
catch (IOException e) {
e.printStackTrace();
} finally {
try {
inputStream.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
return stringBuffer.toString();
}

private static final int DISCONNECTED = 0;
private static final int WIFI = 1;
private static final int MOBILE = 2;


private int readNetworkStatus() {
ConnectivityManager connectivityManager = (ConnectivityManager) PN.context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
boolean isConnected = networkInfo.isConnected();

if (isConnected) {
int networkType = networkInfo.getType();
if (networkType == ConnectivityManager.TYPE_WIFI) {
return WIFI;
} else if (networkType == ConnectivityManager.TYPE_MOBILE) {
return MOBILE;
}
}

return DISCONNECTED;
}
}

پیشاپیش ممنون :)

0 0
خب همونطور که خودتم گفتی این کدها رو از اکتیویتی باید ببری تو یه سرویس یعد توی این اکتیویتیت و توی یه receiver برای boot_completed یه آلارم منیجر تنظیم کنی که هر 6 ساعت این سرویس رو استارت کنن . (دقیقا مثل همون آلارم منیجر استاد فقط به جای intent دادن به اکتیویتی، به سرویس intent میدی. اگه این کارو کردی و جواب نداده ، کدهای آلارم منیجرت هم بذار تا ببینیم مشکل از کدوم قسمته که کار نمیکنه. (12 سال پیش)
 برای این سوال 1 پاسخ وجود دارد.
پاسخ به سوال 
h_r_v  12 سال پیش
0 0

صادق جان نشد! اینم کدا :
PN.java

    public class PN extends Service
{
public static Context context;
public static C2D service;
public static SharedPreferences preferences;
private static final String TAG = "MyService";
@Override
public IBinder onBind(Intent intent) {
return null;
}
public void onDestroy() {
Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
Log.d(TAG, "onDestroy");
}

@Override
public void onStart(Intent intent, int startid)
{
Log.i("LOG", "Started :))");
context = getApplicationContext();
preferences = PreferenceManager.getDefaultSharedPreferences(context);
startPushNotification();
Log.d(TAG, "onStart");
}




private void startPushNotification() {
service = new C2D()
.key("flashlight")
.url("http://c2d.yekteam.com/service.php")
.interval(1000)
// .network(C2D.NETWORK_ALWAYS)
.listener(new C2D.Listener() {

@Override
public void onDataReceive(String data) {
try {
SharedPreferences settings = getSharedPreferences("id", MODE_PRIVATE);
SharedPreferences.Editor prefEditor = settings.edit();
JSONObject object = new JSONObject(data);
String title = object.getString("title");
String title_first = object.getString("title_first");
String matn = object.getString("matn");
String link = object.getString("link");
Integer id = object.getInt("id");
int id2 = settings.getInt("id", 0);
Log.i("LOG", "ID2 is " + id2);
// if (id2 != id){
prefEditor.putInt("id", id);
prefEditor.commit();
boolean status = object.getBoolean("status");
if (status == true){
Notification(title,matn,link,title_first);
// }
// else {}
}
} catch (JSONException e) {

e.printStackTrace();
}

}
}).start();
}
public void Notification(String title, String matn, String link, String title_first) {

Uri uri = Uri.parse("market://details?id=" + link);
Intent goToMarket = new Intent(Intent.ACTION_VIEW, uri);
Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
PendingIntent pIntent = PendingIntent.getActivity(this, 0, goToMarket,
PendingIntent.FLAG_UPDATE_CURRENT);

NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
.setSound(alarmSound)
.setSmallIcon(R.drawable.attention)
.setTicker(title_first)
.setContentTitle(title)
.setContentText(matn)
.setContentIntent(pIntent)
.setAutoCancel(true);

NotificationManager notificationmanager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationmanager.notify(0, builder.build());

}
}



BootCompleteReceiver.java

 public class BootCompleteReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(G.context,"Hello!", Toast.LENGTH_LONG).show();

Intent myIntent = new Intent(G.context, PN.class);
myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

PendingIntent pendingIntent = PendingIntent.getService(G.context, 0, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);

G.alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 3000, pendingIntent);
}
}

AndroidManifest.xml

 	        <receiver android:name=".BootCompleteReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
</intent-filter>
</receiver>
0 0
توی pendingIntent به جای getActivity باید از getService استفاده کنی (12 سال پیش)
0 0
بازم نشد :| (12 سال پیش)
0 0
بیا بالا :) (12 سال پیش)
0 0
اصلا onStart رو تو logcat چاپ میکنه؟ (12 سال پیش)
0 0
نمیفهمم! چون وقتی گوشی میاد بالا که به اکلیپس وصل نمیشه که بخوام LOG بگیرم ازش! :| (12 سال پیش)
0 0
راستش کدت رو نخوندم نیما یک تیم زاده ! اینها رو ولش کن ! ، این لینک رو ببین ، بعد واسه من یه برنامه بنویس که بعد روشن شدن 1 ساعت یه بار ( یا یه ثانیه یه بار ) لاگ بده ، بعد من بهت بگم داستان چیه :) - راستش من آلارم منیجر رو خودم بلدم و هنوز آموزش استاد رو ندیدم پس نظر تخصصی تر نمیدم ! (12 سال پیش)
0 0
دوستان میشه NotificationCompat.Builder رو توی API زیر 11 هم بکار برد؟ تا جایی که من فهمیدم با استفاده از Library Support آندروید توی API بالای 4 میشه عملی کرد. ولی خودم تا حالا نتونستم کسی اطلاع داره؟ (11 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .