Android 当我向firebase添加新闻时,是否有任何方法可以自动发送推送通知

Android 当我向firebase添加新闻时,是否有任何方法可以自动发送推送通知,android,android-studio,push-notification,Android,Android Studio,Push Notification,这是用于向fire base添加新闻的java文件 public class newsadding extends AppCompatActivity { FirebaseDatabase database = FirebaseDatabase.getInstance(); final DatabaseReference myRef = database.getReference("allNews"); EditText date, name; Button b

这是用于向fire base添加新闻的java文件

public class newsadding extends AppCompatActivity {
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    final DatabaseReference myRef = database.getReference("allNews");

    EditText date, name;
    Button btsave, btdelete, btshow;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_newsadding);

        date =(EditText) findViewById(R.id.id);
        name =(EditText) findViewById(R.id.editName);

        btsave = (Button) findViewById(R.id.btSave);
        btdelete = (Button) findViewById(R.id.btDelete);
        btshow = (Button) findViewById(R.id.btShow);

        // save the record
        btsave.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String  n = date.getText().toString();
                String nom = name.getText().toString();
                try {
                    myRef.child("allNews").push().setValue(n+" : "+nom);
                    Toast.makeText(newsadding.this, "Record saved", Toast.LENGTH_SHORT).show();
                }
                catch (Exception e)
                {
                    Toast.makeText(newsadding.this, "Record not saved" + e.toString(), Toast.LENGTH_SHORT).show();
                }
            }
        });

        // delete a record

        btdelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                try {
                    String n = date.getText().toString();
                    String q = database.getReference().toString();
                    Toast.makeText(newsadding.this, "record deleted", Toast.LENGTH_SHORT).show();
                }
                catch (Exception ex) {
                    Toast.makeText(newsadding.this, ex.getMessage(), Toast.LENGTH_SHORT).show();
                }
            }
        });

        // show all records

        btshow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i1 = new Intent(newsadding.this, usernews.class);
                startActivity(i1);
            }
        });
    }
}
这是用于在列表视图中显示信息的文件

public class usernews extends AppCompatActivity {
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    final DatabaseReference myRef = database.getReference("allNews").child("allNews");
    TextView fullnews;

    ProgressBar loading;
    private ListView lsStudents;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_usernews);
        loading = (ProgressBar) findViewById(R.id.loading);
        lsStudents=(ListView) findViewById(R.id.list);
        fullnews=(TextView) findViewById(R.id.fullnews);
        fullnews.setVisibility(View.INVISIBLE);

        Toast.makeText(usernews.this,
                 "يرجى التأكد من أنك متصل بالإنترنت إذالم تكن متصل بعد...", Toast.LENGTH_LONG).show();

        myRef.addValueEventListener(new ValueEventListener() {

            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                // This method is called once with the initial value and again
                // whenever data at this location is updated.

                final List<String> areas = new ArrayList<String>();
                for (DataSnapshot areaSnapshot: dataSnapshot.getChildren()) {
                    // Get value from areaSnapShot not from dataSnapshot
                    String value1 = String.valueOf(areaSnapshot.getValue());
                    areas.add(value1);

                    if (lsStudents.equals(null)){
                        loading.setVisibility(View.VISIBLE);
                    }

                    if (!lsStudents.equals(null)){
                        loading.setVisibility(View.GONE);
                    }
                }

                String value2 = String.valueOf(dataSnapshot.getValue());    
                ArrayList<String> areas2 = new ArrayList<String>(areas);
                Collections.reverse(areas2);

                ArrayAdapter<String> areasAdapter = new ArrayAdapter<String>(usernews.this,android.R.layout.simple_expandable_list_item_1, areas);
                lsStudents.setAdapter(areasAdapter);
                lsStudents.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    public void onItemClick(AdapterView<?> adapter, View view, int position, long arg) { 
                        fullnews.setVisibility(View.VISIBLE);
                        String newss = (lsStudents.getItemAtPosition(position).toString());
                        fullnews.setText(newss);
                    }
                });
            }

            @Override
            public void onCancelled(DatabaseError error) {
                // Failed to read value
                Toast.makeText(usernews.this,
                       error + "!!!!!خطاء في الاتصال !!!!!!", Toast.LENGTH_LONG).show();
            }
        });
    }
}
公共类usernews扩展了AppCompative活动{
FirebaseDatabase=FirebaseDatabase.getInstance();
final DatabaseReference myRef=database.getReference(“allNews”).child(“allNews”);
文本查看完整新闻;
钢筋加载;
私人学生;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u usernews);
加载=(ProgressBar)findViewById(R.id.loading);
lsStudents=(ListView)findViewById(R.id.list);
fullnews=(TextView)findViewById(R.id.fullnews);
fullnews.setVisibility(View.INVISIBLE);
Toast.makeText(usernews.this,
“长的,长的,长的…”;
myRef.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
//使用初始值调用此方法一次,然后再次调用
//每当更新此位置的数据时。
最终列表区域=新的ArrayList();
对于(DataSnapshot areaSnapshot:DataSnapshot.getChildren()){
//从areaSnapShot而不是从dataSnapshot获取值
String value1=String.valueOf(areaSnapshot.getValue());
增加(价值1);
if(lsStudents.equals(null)){
加载.setVisibility(视图.VISIBLE);
}
如果(!lsStudents.equals(null)){
loading.setVisibility(View.GONE);
}
}
String value2=String.valueOf(dataSnapshot.getValue());
ArrayList areas2=新的ArrayList(区域);
收藏。反向(区域2);
ArrayAdapter areasAdapter=新的ArrayAdapter(usernews.this,android.R.layout.simple\u expandable\u list\u item\u 1,areas);
lsStudents.setAdapter(区域适配器);
lsStudents.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
public void onItemClick(AdapterView适配器、视图视图、int位置、长参数){
fullnews.setVisibility(View.VISIBLE);
字符串news=(lsStudents.getItemAtPosition(position.toString());
fullnews.setText(news);
}
});
}
@凌驾
已取消的公共无效(DatabaseError错误){
//无法读取值
Toast.makeText(usernews.this,
错误+“!!!!!”,吐司。长度。显示();
}
});
}
}

现在我知道你可以通过fire base页面上的通知栏从fire base发送信息,但我不想手动添加信息,因为我的应用程序中的这些页面用于新闻,我不能总是手动添加,因为我不是唯一添加这些新闻的人,所以我需要应用程序显示一个简单的栏这表示新的新闻和我的应用程序名称和标志的背景与信息的声音。有人能帮忙吗?

首先,您必须在客户端应用程序中注册和订阅主题。一旦订阅,他们将收到通知。要发送通知,请参阅firebase教程。首先,您必须在客户端应用程序中注册和订阅主题。一旦订阅,他们将收到通知。要发送通知,请参阅要查看firebase教程,请在共享首选项中保存列表计数。然后检查您的列表计数是否超过上次保存的列表计数。如果较大,则构建本地通知&将列表中最后添加的项目显示为通知。
    // Method to send Notifications from server to client end.
    public final static String AUTH_KEY_FCM = "API_KEY_HERE";
    public final static String API_URL_FCM = "https://fcm.googleapis.com/fcm/send";

    public static void pushFCMNotification( ) throws Exception {

        String authKey = AUTH_KEY_FCM; // You FCM AUTH key
        String FMCurl = API_URL_FCM;

        URL url = new URL(FMCurl);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();

        conn.setUseCaches(false);
        conn.setDoInput(true);
        conn.setDoOutput(true);

        conn.setRequestMethod("POST");
        conn.setRequestProperty("Authorization", "key=" + authKey);
        conn.setRequestProperty("Content-Type", "application/json");

        JSONObject data = new JSONObject();
        data.put("to","/topics/foo-bar");
        JSONObject info = new JSONObject();
        info.put("title", "FCM Notificatoin Title"); // Notification title
        info.put("body", "Hello First Test notification"); // Notification body
        data.put("data", info);

        OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
        wr.write(data.toString());
        wr.flush();
        wr.close();

        int responseCode = conn.getResponseCode();
        System.out.println("Response Code : " + responseCode);

        BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        String inputLine;
        StringBuffer response = new StringBuffer();

        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        in.close();

    }

btsave.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

pushFCMNotification();

            }
        });

无需每次更改Firebase上的数据时都从Firebase推送通知。

将列表计数保存在共享首选项中。然后检查您的列表计数是否超过上次保存的列表计数。如果较大,则构建本地通知&将列表中最后添加的项目显示为通知。
无需每次更改Firebase上的数据时都从Firebase推送通知。

每次添加一些新闻时,您都可以在数据库中创建一个名为“通知”的子项,并向其中添加要为发布的特定新闻项生成的通知的标题和消息

确保使用你的应用程序的所有用户都订阅了某个主题

最后,运行一个服务器端脚本(我使用Node.js)来侦听“notifications”子项,每次添加子项时,它都会拍摄一个数据快照,检索标题和消息,并向用户订阅的主题发送主题通知

只要你的应用程序中有一个活动的服务并且它在后台运行,它就会自动收到推送通知


有关主题通知和用于服务器通信的REST API的详细信息,请转到。

每次添加新闻时,您都可以在数据库中创建一个名为“通知”的子项,并可以在其中添加要为发布的特定新闻项生成的通知的标题和消息

确保使用你的应用程序的所有用户都订阅了某个主题

最后,运行一个服务器端脚本(我使用Node.js实现此目的),该脚本侦听“notifications”子项,每次向其添加子项时,它都会拍摄一个数据快照,检索标题和消息,并向您的用户感兴趣的主题发送一个主题通知