Java 我如何在应用程序关闭时显示通知?
我有一个视频通话应用程序(叫做FtoF,目前在play store上)。我想在一个用户呼叫另一个用户时显示一个通知,我这样做了(第110-132行和第255行),问题是这只在应用程序打开时起作用。即使在应用程序关闭的情况下,我如何使通知生效? 我给你留下密码: 调用Activity.javaJava 我如何在应用程序关闭时显示通知?,java,android,android-notifications,Java,Android,Android Notifications,我有一个视频通话应用程序(叫做FtoF,目前在play store上)。我想在一个用户呼叫另一个用户时显示一个通知,我这样做了(第110-132行和第255行),问题是这只在应用程序打开时起作用。即使在应用程序关闭的情况下,我如何使通知生效? 我给你留下密码: 调用Activity.java public class CallingActivity extends AppCompatActivity { private TextView nameContact; private
public class CallingActivity extends AppCompatActivity {
private TextView nameContact;
private ImageView profileImage;
private ImageView cancelCallBtn, acceptCallBtn; //private ImageView cancelCallBtn, acceptCallBtn;
private String callingId="", ringingId="";
private String reciverUserId="", receiverUserImage="", receiverUserName="";
private String senderUserId="", senderUserImage="", senderUserName="", checker="";
private DatabaseReference userRef;
private MediaPlayer mediaPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_calling);
senderUserId = FirebaseAuth.getInstance().getCurrentUser().getUid();
reciverUserId = getIntent().getExtras().get("visit_user_id").toString();
userRef = FirebaseDatabase.getInstance().getReference().child("Users");
nameContact = findViewById(R.id.name_calling);
profileImage = findViewById(R.id.profile_image_calling);
cancelCallBtn = findViewById(R.id.cancel_call);
acceptCallBtn = findViewById(R.id.make_call);
cancelCallBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
checker = "clicked";
cancelCallingUser();
}
});
acceptCallBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final HashMap<String, Object> callingPickUpMap = new HashMap<>();
callingPickUpMap.put("picked", "picked");
userRef.child(senderUserId).child("Ringing")
.updateChildren(callingPickUpMap)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
Intent intent = new Intent(CallingActivity.this, VideoCallActivity.class);
startActivity(intent);
}
});
}
});
getAndSetUserProfileInfo();
}
private void addNotification() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
NotificationChannel channel =
new NotificationChannel("MyNotifications", "MyNotifications", NotificationManager.IMPORTANCE_DEFAULT);
NotificationManager manager = getSystemService(NotificationManager.class);
manager.createNotificationChannel(channel);
}
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "MyNotifications")
.setContentTitle("Chiamata in arrivo da "+ receiverUserName)
.setSmallIcon(R.mipmap.ic_launcher)
.setAutoCancel(true)
.setContentText("Apri FtoF per partecipare alla videochiamata");
NotificationManagerCompat manager = NotificationManagerCompat.from(this);
manager.notify(999, builder.build());
}
private void getAndSetUserProfileInfo() {
userRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(dataSnapshot.child(reciverUserId).exists()){
receiverUserImage = dataSnapshot.child(reciverUserId).child("image").getValue().toString();
receiverUserName = dataSnapshot.child(reciverUserId).child("name").getValue().toString();
nameContact.setText(receiverUserName);
Picasso.get().load(receiverUserImage).placeholder(R.drawable.profile_image).into(profileImage);
}
if(dataSnapshot.child(senderUserId).exists()){
senderUserImage = dataSnapshot.child(senderUserId).child("image").getValue().toString();
senderUserName = dataSnapshot.child(senderUserId).child("name").getValue().toString();
}
TextView info_txt = (TextView) findViewById(R.id.txt);
info_txt.setText("in attesa che " + receiverUserName + " accetti l'invito..."); //concatenazione per testo sotto al nome
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) { }
});
}
@Override
protected void onStart() {
super.onStart();
userRef.child(reciverUserId)
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (!checker.equals("clicked") && !dataSnapshot.hasChild("Calling") && !dataSnapshot.hasChild("Ringing")){
final HashMap<String, Object> callingInfo = new HashMap<>();
callingInfo.put("calling", reciverUserId);
userRef.child(senderUserId)
.child("Calling")
.updateChildren(callingInfo)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()){
final HashMap<String, Object> ringingInfo = new HashMap<>();
ringingInfo.put("ringing", senderUserId);
userRef.child(reciverUserId)
.child("Ringing")
.updateChildren(ringingInfo);
}
}
});
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) { }
});
userRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(dataSnapshot.child(senderUserId).hasChild("Ringing") && !dataSnapshot.child(senderUserId).hasChild("Calling")){
addNotification();
acceptCallBtn.setVisibility(View.VISIBLE);
}
if (dataSnapshot.child(reciverUserId).child("Ringing").hasChild("picked"))
{
Intent intent = new Intent(CallingActivity.this, VideoCallActivity.class);
startActivity(intent);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) { }
});
}
private void cancelCallingUser() {
//sender
userRef.child(senderUserId)
.child("Calling")
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists() && dataSnapshot.hasChild("calling"))
{
callingId = dataSnapshot.child("calling").getValue().toString();
userRef.child(callingId)
.child("Ringing")
.removeValue()
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()){
userRef.child(senderUserId)
.child("Calling")
.removeValue()
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
startActivity(new Intent(CallingActivity.this, RegistrationActivity.class));
finish();
}
});
}
}
});
} else {
startActivity(new Intent(CallingActivity.this, RegistrationActivity.class));
finish();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
//receiver
userRef.child(senderUserId)
.child("Ringing")
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists() && dataSnapshot.hasChild("ringing"))
{
ringingId = dataSnapshot.child("ringing").getValue().toString();
userRef.child(ringingId)
.child("Calling")
.removeValue()
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()){
userRef.child(senderUserId)
.child("Ringing")
.removeValue()
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
startActivity(new Intent(CallingActivity.this, RegistrationActivity.class));
finish();
}
});
}
}
});
}
else {
startActivity(new Intent(CallingActivity.this, RegistrationActivity.class));
finish();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}
公共类调用活动扩展了AppCompatActivity{
私有文本视图名称联系人;
私有图像查看配置文件图像;
private ImageView cancelCallBtn,acceptCallBtn;//private ImageView cancelCallBtn,acceptCallBtn;
私有字符串callingId=“”,ringingId=“”;
私有字符串reciverUserId=“”,receiverUserImage=“”,receiverUserName=“”;
私有字符串senderUserId=“”,senderUserImage=“”,senderUserName=“”,checker=“”;
私有数据库引用userRef;
私人媒体播放器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_调用);
senderUserId=FirebaseAuth.getInstance().getCurrentUser().getUid();
reciverUserId=getIntent().getExtras().get(“访问用户id”).toString();
userRef=FirebaseDatabase.getInstance().getReference().child(“用户”);
nameContact=findViewById(R.id.name\u调用);
profileImage=findviewbyd(R.id.profile\u image\u调用);
cancelCallBtn=findviewbyd(R.id.cancel\u call);
acceptCallBtn=findViewById(R.id.make_call);
cancelCallBtn.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
checker=“单击”;
取消Callinguser();
}
});
acceptCallBtn.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
最终HashMap callingPickUpMap=新HashMap();
调用pickupmap.put(“拾取”、“拾取”);
userRef.child(senderUserId).child(“铃声”)
.updateChildren(调用PickupMap)
.addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
意向意向=新意向(调用Activity.this、VideoCallActivity.class);
星触觉(意向);
}
});
}
});
getAndSetUserProfileInfo();
}
私有void addNotification(){
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.O){
通知频道=
新建NotificationChannel(“MyNotifications”、“MyNotifications”、NotificationManager.IMPORTANCE\u DEFAULT);
NotificationManager=getSystemService(NotificationManager.class);
manager.createNotificationChannel(频道);
}
NotificationCompat.Builder=新建NotificationCompat.Builder(此“MyNotifications”)
.setContentTitle(“arrivo da中的Chiamata”+接收方用户名)
.setSmallIcon(R.mipmap.ic_启动器)
.setAutoCancel(真)
.setContentText(“每一方的Apri FtoF alla videochiamata”);
NotificationManagerCompat manager=来自(此)的NotificationManagerCompat;
manager.notify(999,builder.build());
}
私有void getAndSetUserProfileInfo(){
userRef.addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
if(dataSnapshot.child(reciverUserId).exists()){
receiverUserImage=dataSnapshot.child(ReceiverUserId).child(“图像”).getValue().toString();
receiverUserName=dataSnapshot.child(ReceiverUserId).child(“名称”).getValue().toString();
nameContact.setText(接收方用户名);
Picasso.get().load(receiverUserImage).placeholder(R.drawable.profile\u image).into(profileImage);
}
if(dataSnapshot.child(senderUserId.exists()){
senderUserImage=dataSnapshot.child(senderUserId).child(“图像”).getValue().toString();
senderUserName=dataSnapshot.child(senderUserId).child(“名称”).getValue().toString();
}
TextView info_txt=(TextView)findViewById(R.id.txt);
info_txt.setText(“在attesa che中”+接收者用户名+“accetti l'invito…”);//每个testo sotto al nome的concatenazione
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){}
});
}
@凌驾
受保护的void onStart(){
super.onStart();
userRef.child(reciverUserId)
.addListenerForSingleValueEvent(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
如果(!checker.equals(“单击”)和&!dataSnapshot.hasChild(“调用”)和&!dataSnapshot.hasChild(“响铃”)){
final HashMap callingInfo=新HashMap();
callingInfo.put(“调用”,receiveruserid);
userRef.child(senderUserId)
.儿童(“呼叫”)
.updateChildren(callingInfo)
.addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
最终哈希映射
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.conta.ftof">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".donate" />
<activity android:name=".VideoCallActivity" />
<activity android:name=".CallingActivity" />
<activity android:name=".ProfileActivity" />
<activity android:name=".FindPeopleActivity" />
<activity android:name=".NotificationsActivity" />
<activity android:name=".SettingsActivity" />
<activity
android:name=".ContactsActivity"
android:label="@string/title_activity_main" />
<activity android:name=".RegistrationActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="ca-app-pub-3400243939195187~6852949310"/>
<receiver android:name=".ReminderBroadcast"/>
</application>
</manifest>