Push Notifications in Android Platform

后端 未结 20 995
长发绾君心
长发绾君心 2020-11-22 11:07

I am looking to write an app that receives pushed alerts from a server. I found a couple of methods to do this.

  1. SMS - Intercept the incoming SMS and initiate
相关标签:
20条回答
  • 2020-11-22 11:29

    Google C2DM is depreciated now, for that, you have o use the new service GCM (Google Cloud Messaging). For documantation, see http://developer.android.com/guide/google/gcm/gs.html

    0 讨论(0)
  • 2020-11-22 11:33

    You can use Xtify (http://developer.xtify.com) - they have a push notifications webservice that works with their SDK. it's free and so far, it's worked really well for me.

    0 讨论(0)
  • 2020-11-22 11:34

    (cross-posting from an answer I gave to a similar question - Does Android support near real time push notification? )

    I recently started playing with MQTT http://mqtt.org for Android as a way of doing this sort of thing (i.e. push notification that is not SMS but data driven, almost immediate message delivery, not polling, etc.)

    I have a blog post with background information on this in case it's helpful

    http://dalelane.co.uk/blog/?p=938

    (Note: MQTT is an IBM technology, and I should point out that I work for IBM.)

    0 讨论(0)
  • 2020-11-22 11:35

    Here I have written few steps for How to Get RegID and Notification starting from scratch

    1. Create/Register App on Google Cloud
    2. Setup Cloud SDK with Development
    3. Configure project for GCM
    4. Get Device Registration ID
    5. Send Push Notifications
    6. Receive Push Notifications

    You can find complete tutorial in below URL link

    Getting Started with Android Push Notification : Latest Google Cloud Messaging (GCM) - step by step complete tutorial

    enter image description here

    Code snip to get Registration ID (Device Token for Push Notification).

    Configure project for GCM


    Update AndroidManifest file

    For enable GCM in our project we need to add few permission in our manifest file Go to AndroidManifest.xml and add below code Add Permission

    <uses-permission android:name="android.permission.INTERNET”/>
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    
    <uses-permission android:name="android.permission.VIBRATE" />
    
    <uses-permission android:name=“.permission.RECEIVE" />
    <uses-permission android:name=“<your_package_name_here>.permission.C2D_MESSAGE" />
    <permission android:name=“<your_package_name_here>.permission.C2D_MESSAGE"
            android:protectionLevel="signature" />
    

    Add GCM Broadcast Receiver declaration

    add GCM Broadcast Receiver declaration in your application tag

    <application
            <receiver
                android:name=".GcmBroadcastReceiver"
                android:permission="com.google.android.c2dm.permission.SEND" ]]>
                <intent-filter]]>
                    <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                    <category android:name="" />
                </intent-filter]]>
    
            </receiver]]>
         
    <application/>
    

    Add GCM Servie declaration

    <application
         <service android:name=".GcmIntentService" />
    <application/>
    

    Get Registration ID (Device Token for Push Notification)

    Now Go to your Launch/Splash Activity

    Add Constants and Class Variables

    private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;
    public static final String EXTRA_MESSAGE = "message";
    public static final String PROPERTY_REG_ID = "registration_id";
    private static final String PROPERTY_APP_VERSION = "appVersion";
    private final static String TAG = "LaunchActivity";
    protected String SENDER_ID = "Your_sender_id";
    private GoogleCloudMessaging gcm =null;
    private String regid = null;
    private Context context= null;
    

    Update OnCreate and OnResume methods

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_launch);
         context = getApplicationContext();
             if (checkPlayServices()) 
         {
                gcm = GoogleCloudMessaging.getInstance(this);
                regid = getRegistrationId(context);
    
                if (regid.isEmpty())
                {
                    registerInBackground();
                }
                else
                {
                Log.d(TAG, "No valid Google Play Services APK found.");
                }
          }
     }
    
    @Override protected void onResume()
    {
           super.onResume();       checkPlayServices();
    }
    
    
    # Implement GCM Required methods (Add below methods in LaunchActivity)
    
    private boolean checkPlayServices() {
            int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
            if (resultCode != ConnectionResult.SUCCESS) {
                if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) {
                    GooglePlayServicesUtil.getErrorDialog(resultCode, this,
                            PLAY_SERVICES_RESOLUTION_REQUEST).show();
                } else {
                    Log.d(TAG, "This device is not supported - Google Play Services.");
                    finish();
                }
                return false;
            }
            return true;
     }
    
    private String getRegistrationId(Context context) 
    {
       final SharedPreferences prefs = getGCMPreferences(context);
       String registrationId = prefs.getString(PROPERTY_REG_ID, "");
       if (registrationId.isEmpty()) {
           Log.d(TAG, "Registration ID not found.");
           return "";
       }
       int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE);
       int currentVersion = getAppVersion(context);
       if (registeredVersion != currentVersion) {
            Log.d(TAG, "App version changed.");
            return "";
        }
        return registrationId;
    }
    
    private SharedPreferences getGCMPreferences(Context context) 
    {
        return getSharedPreferences(LaunchActivity.class.getSimpleName(),
                    Context.MODE_PRIVATE);
    }
    
    private static int getAppVersion(Context context) 
    {
         try 
         {
             PackageInfo packageInfo = context.getPackageManager()
                        .getPackageInfo(context.getPackageName(), 0);
                return packageInfo.versionCode;
          } 
          catch (NameNotFoundException e) 
          {
                throw new RuntimeException("Could not get package name: " + e);
          }
    }
    
    
    private void registerInBackground() 
    {     new AsyncTask() {
         Override
         protected Object doInBackground(Object... params) 
         {
              String msg = "";
              try 
              {
                   if (gcm == null) 
                   {
                            gcm = GoogleCloudMessaging.getInstance(context);
                   }
                   regid = gcm.register(SENDER_ID);               Log.d(TAG, "########################################");
                   Log.d(TAG, "Current Device's Registration ID is: "+msg);     
              } 
              catch (IOException ex) 
              {
                  msg = "Error :" + ex.getMessage();
              }
              return null;
         }     protected void onPostExecute(Object result) 
         { //to do here };
      }.execute(null, null, null);
    }
    

    Note : please store REGISTRATION_KEY, it is important for sending PN Message to GCM also keep in mine this will be unique for all device, by using this only GCM will send Push Notification.

    Receive Push Notifications

    Add GCM Broadcast Receiver Class

    As we have already declared “GcmBroadcastReceiver.java” in our Manifest file, So lets create this class update receiver class code this way

    public class GcmBroadcastReceiver extends WakefulBroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) 
        {        ComponentName comp = new ComponentName(context.getPackageName(),
                    GcmIntentService.class.getName());        startWakefulService(context, (intent.setComponent(comp)));
            setResultCode(Activity.RESULT_OK);
            Toast.makeText(context, “wow!! received new push notification", Toast.LENGTH_LONG).show();
        }
    }
    

    Add GCM Service Class

    As we have already declared “GcmBroadcastReceiver.java” in our Manifest file, So lets create this class update receiver class code this way

    public class GcmIntentService extends IntentService
    {     public static final int NOTIFICATION_ID = 1;     private NotificationManager mNotificationManager;     private final static String TAG = "GcmIntentService";     public GcmIntentService() {
         super("GcmIntentService");     
         }     @Override
         protected void onHandleIntent(Intent intent) {
              Bundle extras = intent.getExtras();
              Log.d(TAG, "Notification Data Json :" + extras.getString("message"));
    
              GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);
              String messageType = gcm.getMessageType(intent);          if (!extras.isEmpty()) {          if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR
                   .equals(messageType)) {
                   sendNotification("Send error: " + extras.toString());
              } else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED
              .equals(messageType)) {
              sendNotification("Deleted messages on server: "
              + extras.toString());          // If it's a regular GCM message, do some work.
              } else if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE
              .equals(messageType)) {
              // This loop represents the service doing some work.
              for (int i = 0; i < 5; i++) {
                   Log.d(TAG," Working... " + (i + 1) + "/5 @ "
                   + SystemClock.elapsedRealtime());               try {
                        Thread.sleep(5000);
                   } catch (InterruptedException e) {
                   }
                 }
                 Log.i(TAG, "Completed work @ " + SystemClock.elapsedRealtime());
                 sendNotification(extras.getString("message"));
               }
            }        // Release the wake lock provided by the WakefulBroadcastReceiver.
            GcmBroadcastReceiver.completeWakefulIntent(intent);
         }     // Put the message into a notification and post it.
         // This is just one simple example of what you might choose to do with
         // a GCM message.
         private void sendNotification(String msg) {          mNotificationManager = (NotificationManager) this
              .getSystemService(Context.NOTIFICATION_SERVICE);
              PendingIntent contentIntent = PendingIntent.getActivity(this, 0,          new Intent(this, LaunchActivity.class), 0);
    
              NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(          this)
              .setSmallIcon(R.drawable.icon)
              .setContentTitle("Ocutag Snap")
              .setStyle(new NotificationCompat.BigTextStyle().bigText(msg))
              .setContentText(msg)
              .setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE);
    
              mBuilder.setContentIntent(contentIntent);          mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
         }
    }
    
    0 讨论(0)
  • 2020-11-22 11:35

    C2DM: your app-users must have the gmail account.

    MQTT: when your connection reached to 1024, it will stop work because of it used "select model " of linux.

    There is a free push service and api for android, you can try it: http://push-notification.org

    0 讨论(0)
  • 2020-11-22 11:40

    As of 18/05/2016 Firebase is Google's unified platform for mobile developers including push notifications.

    0 讨论(0)
提交回复
热议问题