앱에 푸쉬기능을 사용하기 위해서 자체적으로 푸쉬기능을 사용해야 했다.

그래서 GCM종류를 찾아보다가 , 기껏 GCM으로 기능을 구현을 다 해놓으니 , 우리팀에서 서버를 안쓰기로 결정한것...또르르....


그래서 Notification Push를 다시 찾아보게 되었다.


일단 Android Project를 생성하자.



하단에 나와있는

A non-empty directory already exists at the specified project location. Existing files may be overwritten. Procceed with caution.

이라는 경고문은 내가 이미 구현을 마쳐놓은 후에 포스팅을 하기 때문에 발생하는 에러이다.

뭐.. 이미 있으니까 덮어쓰기 주의 하라네요.


Manifest입니다.

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

package="com.example.kwongyo.notificationtest" >
<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" >
<activity android:name="com.example.kwongyo.notificationtest.MainActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

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

</application>
<service android:name=".NotificationService"
android:enabled="true"/>
<receiver android:name=".NotificationReceiver"/>

</manifest>

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

은 디바이스가 활성화 되지 않았을떄( 켜져있지 않았을 때) 화면을 활성화 시켜주는 옵션이다.

service android:name=".NotificationService"는 service를 등록해주는데, 서비스를 실행시킬 서비스 클래스를 호출한다.

android:enable="true"는 default값이 true이다. 화면의 컴포넌트가 인스턴스화 될 지 안될지 선택하는 속성값이다.

receiver android:name=".NotificationReceiver"/>는 NotificationReceiver (리시버를 받을)클래스를 클래스를 명시적으로 작성해준것이다.


여기에선 service와 receiver는 구현한 부분에 대해선 설명하지 않았다.

service와 receiver는 특정한 시간에 알람을 주거나 특정 행위를 해야 할 때 AlarmManager와 사용한다.
layout입니다.

 <?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"
android:orientation="vertical">

<TextView
android:id="@+id/textView"
android:text="Hello World!" android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/alarmBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="alarmBtn"/>
</LinearLayout>


기능이 중요하니 심플하게 작성하고,


MainActivity입니다.


코드는 Layout에 맞춰서 Button을 클릭할 때 마다 알람이 올 수 있도록 작성했습니다.

import android.app.AlarmManager;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import java.util.Calendar;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Button button = (Button)findViewById(R.id.alarmBtn);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
NotificationManager notificationManager= (NotificationManager)MainActivity.this.getSystemService(MainActivity.this.NOTIFICATION_SERVICE);
Intent intent1 = new Intent(MainActivity.this.getApplicationContext(),MainActivity.class); //인텐트 생성.



Notification.Builder builder = new Notification.Builder(getApplicationContext());
intent1.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP| Intent.FLAG_ACTIVITY_CLEAR_TOP);//현재 액티비티를 최상으로 올리고, 최상의 액티비티를 제외한 모든 액티비티를 

없앤다.

PendingIntent pendingNotificationIntent = PendingIntent.getActivity( MainActivity.this,0, intent1,PendingIntent.FLAG_UPDATE_CURRENT);
//PendingIntent는 일회용 인텐트 같은 개념입니다.
FLAG_UPDATE_CURRENT - > 만일 이미 생성된 PendingIntent가 존재 한다면, 해당 Intent의 내용을 변경함.

FLAG_CANCEL_CURRENT - .이전에 생성한 PendingIntent를 취소하고 새롭게 하나 만든다.

FLAG_NO_CREATE -> 현재 생성된 PendingIntent를 반환합니다.

FLAG_ONE_SHOT - >이 플래그를 사용해 생성된 PendingIntent는 단 한번밖에 사용할 수 없습니다
builder.setSmallIcon(R.drawable.on).setTicker("HETT").setWhen(System.currentTimeMillis())
.setNumber(1).setContentTitle("푸쉬 제목").setContentText("푸쉬내용")
.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE).setContentIntent(pendingNotificationIntent).setAutoCancel(true).setOngoing(true);
//해당 부분은 API 4.1버전부터 작동합니다.

//setSmallIcon - > 작은 아이콘 이미지

//setTicker - > 알람이 출력될 때 상단에 나오는 문구.

//setWhen -> 알림 출력 시간.

//setContentTitle-> 알림 제목

//setConentText->푸쉬내용

notificationManager.notify(1, builder.build()); // Notification send
}
});
}

다음과 같이 하면, 버튼을 클릭할 때마다 노티피케이션이 발생합니다.




포스팅을 하는 도중 냉장고에서 물이 새는 대 참사가 발생했다..
ㅠㅠ정신 없어서 급하게 적은 감이 없지않아 있다.
특정한 시간에 알람을 주기 위해선 AlarmManager를 이용하면 된다.
이 부분에 대해서는 다음 포스팅( 강의시간 등등..)을 이용해서 포스팅 해야겠다!

알람 매니저 사용할때는 상세히 적어야지

모두 개강 힘내요~
저는 26학점 듣습니다~!!



+ Recent posts